使用 LINQ 和实体框架检查 c# var 中的空值

Posted

技术标签:

【中文标题】使用 LINQ 和实体框架检查 c# var 中的空值【英文标题】:Checking for null value in c# var with LINQ & Entity framework 【发布时间】:2011-07-10 23:47:06 【问题描述】:

我对 LINQ 和实体框架以及 c# 中的 var 关键字还是很陌生,所以如果这听起来像是一个“新手”问题,请原谅我。

在执行以下操作后检查空值时遇到问题:

var entry = myDB.Entries.Where(e => e.Email == entry.Email);

即使数据库中不存在电子邮件,条目也不等于 null。

因此,在执行下一批语句之前,我必须使用 if (entry.Count() < 1) 来检查现有条目,而不是 if (entry == null)。有什么理由不认为该变量为空?

【问题讨论】:

【参考方案1】:

在您的示例中,entry永远不会成为null。你认为的null 实际上是一个没有项目的IEnumerable<Entry>

如果您想检查是否至少有一个符合您的条件的条目,您通常执行以下操作:

var entries = myDB.Entries.Where(e => e.Email == entry.Email);
if (entries.Any()) 
    // ...

如果你知道最多一个条目,那么你也可以这样做:

var entry = myDB.Entries.Where(e => e.Email == entry.Email).SingleOrDefault();
if (entry != null) 
    // ...

这更接近你的想象,但如果有多个匹配条目,则会抛出异常。

【讨论】:

谢谢!很大的帮助和洞察力,因为我忘记了我正在使用 DBContext 检查条目。 您可以将 .SingleOrDefault() 附加到查询中以获得一个结果或空值。【参考方案2】:

“var”关键字可以在运行时根据赋值实现任何类型,因此当您使用“Where”查询时,var 条目变为由 Where 返回的“IEnumerable”,这就是您必须检查计数的原因.

【讨论】:

var 类型在编译时解析,而不是在运行时解析。 dynamic 类型在运行时解析。【参考方案3】:

在 VB 中

Dim entry = myDB.Entries.Where(Function(e) e.Email = entry.Email).SingleOrDefault()

If entry IsNot Nothing Then

' 我们有一个值

其他

' 我们没有值

如果结束

【讨论】:

以上是关于使用 LINQ 和实体框架检查 c# var 中的空值的主要内容,如果未能解决你的问题,请参考以下文章

LINQ 查询在 C# 中使用实体框架获取单列和单行值而不使用 Where

在带有 Linq 的实体框架中使用 LIKE "%%%"? [复制]

插入束数据 - 实体框架 C#

C# linq:在同一属性字段的列表中检查多个条件

c# ef框架怎么使用linq语句多表查询?

错误 3002:映射片段中的问题 | c# linq 到实体