实体框架 - 在使用之前检查单个记录的正确方法

.net c# entity-framework

要获得记录列表,我通常会做以下事情:

var efCompany = from a in _dbRiv.Company where a.CompanyId == companyFeedInfo.CompanyId select a;

要获得单个记录,当我知道我使用PK来检索它时,我使用类似的东西:

var efCompany = (from a in _dbRiv.Company where a.CompanyId == companyFeedInfo.CompanyId select a).First();

现在,使用单记录方法,如果PK是一个错误的值(就像它有目的地在测试中),第二行会抛出一个错误。

获得单个记录并处理它的最佳实践方法是什么?

一般承认的答案

如果您期望0或1,请使用SingleOrDefault FirstOrDefault如果您只需要第一个记录,则使用SingleOrDefault ,但可以应对0.如果没有结果,两者将返回该类型的默认值(通常为null)。

顺便说一下,这样的查询通常更具可读性(IMO) 而不使用查询表达式,所以你可能会有类似的东西:

var efCompany = _dbRiv.Company
                      .Where(a => a.CompanyId == companyFeedInfo.CompanyId)
                      .SingleOrDefault();

if (efCompany != null)
{
    // Use it
}
else
{
    // Report to user, or whatever
}

当您使用多个运算符或执行相对复杂的事情(如连接)时,查询表达式很棒 - 但如果您刚刚获得了where子句或只是进行了投影,那么这个“点符号”就更简单了。当你需要在最后调用类似FirstOrDefault的方法时,它也会更好。


热门答案

请注意, SingleOrDefault()FirstOrDefault()都不允许您指定默认值。

DefaultIfEmpty() ,它允许您指定在枚举中没有项目时返回的默认值。您可以将这个与First() (如在DefaultIfEmpty().First() )组合以实现FirstOrDefault()的行为,并将lambda包装为创建新实例并将其添加到集合中。

如果您只需要检查是否存在记录,也可以使用Any() 。但是,如果您需要处理记录(如果存在),则会导致两个查询。




许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因
许可下: CC-BY-SA with attribution
不隶属于 Stack Overflow
这个KB合法吗? 是的,了解原因