我有两个示例表:
场景 1
表 1 - 成分
ingredientId(PK, int, not null)
userId(FK, int, not null)
timestamp(datetime, not null)
表 2 - 成分附加信息
ingredientAdditionalInformationId(PK, int, not null)
ingredientId(FK, int, not null)
isApproved(bit, not null)
unitsConverted(bit, not null)
在代码后面选择句子:
public IQueriable GetIngredientData(int ingredientId)
{
using (var context = new MyEntities())
{
var result = context.Ingredient
.Where(i => i.ingredientId == ingredientId)
.Select(i => new
{
i.ingredientId,
i.userId
i.IngredientAdditionalInformation.FirstOrDefault(iai => iai.ingredientId = i.ingredientId).isApproved
i.IngredientAdditionalInformation.FirstOrDefault(iai => iai.ingredientId = i.ingredientId).unitsConverted
});
return result.ToList().AsQueriable();
}
}
或使用联接选择(我知道您可以使用方法语法联接,但我可以更快地使用查询方法编写联接)
public IQueriable GetIngredientData(int ingredientId)
{
using (var context = new MyEntities())
{
var result = from i in context.Ingredient
join iai in context.IngredientAdditionalInformation on i.ingredientId equals iai.ingredientId
where i.ingredientId == 1
select new
{
i.ingredientId,
i.userId
iai.isApproved
iai.unitsConverted
};
return result.ToList().AsQueriable();
}
}
使用 join 或 FirstOrDefault() 哪个更好/更快,或者我应该编写不同的数据库表,如下例 2 所示:
情景 2
表 1 - 成分
ingredientId(PK, int, not null)
userId(FK, int, not null)
timestamp(datetime, not null)
表 2 - 成分
ingredientId(PK, FK, int, not null) //WITHOUT PRIMARY (ingredientAdditionalInformationId) AUTO INCREMENT KEY)
isApproved(bit, not null)
unitsConverted(bit, not null)
因为我知道每种成分只有一个附加信息...
在代码中选择句子
using (var context = new MyEntities())
{
var result = context.Ingredient
.Where(i => i.ingredientId = 1)
.Select(i => new
{
i.ingredientId,
i.userId
i.IngredientAdditionalInformation.isApproved
i.IngredientAdditionalInformation.unitsConverted
});
}
我想知道哪种表设计更适合优化选择(SCENARIO1 或 SCENARIO2),如果我真的需要在成分AdditionalInformation 中自动递增键,如果我知道每种成分只有一个条目并且这是正确的使用方式实体框架?