Lambda 与 LINQ - “表达式始终为假”

发布于 2024-11-16 20:57:05 字数 515 浏览 4 评论 0原文

我有以下代码:

var thing = (from t in things
             where t.Type == 1 && t.IsActive
             select t).SingleOrDefault();

if (thing == null)
{
    // throw exception
}

things 是实体框架自我跟踪实体的集合

这工作得很好,但是我想改用 Lambda 表达式,并将 LINQ 更改为:

var thing = things.Select(t => t.Type == 1 && t.IsActive).SingleOrDefault();

现在 Resharper 告诉我 <对于 (thing == null),code>表达式始终为 false。

我错过了什么?

I have the following code:

var thing = (from t in things
             where t.Type == 1 && t.IsActive
             select t).SingleOrDefault();

if (thing == null)
{
    // throw exception
}

things is a collection of Entity Framework Self-Tracking Entities

This works nicely, however I want to use a Lambda expression instead and changed the LINQ to this:

var thing = things.Select(t => t.Type == 1 && t.IsActive).SingleOrDefault();

Now Resharper is telling me Expression is always false for (thing == null).

What have I missed?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

初与友歌 2024-11-23 20:57:05

您希望:

var thing = things.Where(t => t.Type == 1 && t.IsActive).SingleOrDefault();

Select 执行投影(将 IEnumerable 的类型从 IEnumerable 转换为 IEnumerable,其值为 true 如果 t.Type == 1 && t.IsActive == true,否则 false),则SingleOrDefault 返回此序列中唯一的 bool,或者返回 bool 的默认值,如果序列为空。它永远不能为 null,因为 bool 不是引用类型。

Where 执行过滤操作(仅提取那些满足给定条件的对象 - 在本例中,仅选择 Type1 且 < code>IsActive 为 true),将 IEnumerable 的类型保留为 IEnumerable。假设 Thing 是一个类,则 SingleOrDefault 将返回序列中的唯一项或 null

无论哪种情况,如果序列包含多个项目,SingleOrDefault 都会引发异常(在 Select 版本中这种情况的可能性要大得多!)。

You want:

var thing = things.Where(t => t.Type == 1 && t.IsActive).SingleOrDefault();

Select performs a projection (converting the type of the IEnumerable from IEnumerable<Thing> to IEnumerable<bool> with values true if t.Type == 1 && t.IsActive == true, otherwise false), then the SingleOrDefault returns either the only bool in this sequence, or the default value of a bool which is false if the sequence is empty. This can never be null since bool is not a reference type.

Where performs a filtering action (pulling out only those objects that meet a given criterion - in this case only selecting those where Type is 1 and IsActive is true), leaving the type of the IEnumerable as IEnumerable<Thing>. Assuming Thing is a class, the SingleOrDefault will return the only item in the sequence or null.

In either case, SingleOrDefault will throw an exception if the sequence contains more than one item (which is far more likely in the Select version!).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文