在 LINQ 中多次调用 FirstOrDefault 以设置对象属性

本文关键字:设置 对象 属性 FirstOrDefault 调用 LINQ | 更新日期: 2023-09-27 18:32:09

我有一个像这样的 LINQ 查询:

var Item = (from s in contextD.Items where s.Id == Id select s).ToList();

再往下,Item 对象属性设置如下:

Item.FirstOrDefault().Qty = qtyToUpdate;
Item.FirstOrDefault().TotalPrice = UItem.FirstOrDefault().Qty *  UItem.FirstOrDefault().Price;
 ...

我的问题是,调用 FirstOrDefault 是否总是遍历查询返回的结果集?

不应该进行一次调用并将其放入这样的对象中:

MyObject objMyObject = new MyObject;
objMyObject = Item.FirstOrDefault();

然后开始设置 objMyObject 属性。

使用FirstOrDefault的第一部分实际上是在生产中,我试图找出这是否是正确的方法。

问候。

在 LINQ 中多次调用 FirstOrDefault 以设置对象属性

将调用 FirstOrDefault 始终遍历结果集 由查询返回?

FirstOrDefault()从不遍历所有结果集 - 它要么返回第一项,要么返回默认设置(如果 set 为空)。同样在这种特殊情况下,甚至不会创建枚举器 - 因此您正在对List<T>类型的变量调用FirstOrDefault(),只需返回索引 0 处的项目(如果列表不为空)。如果要调查Enumerable.FirstOrDefault()实现:

IList<TSource> list = source as IList<TSource>;
if (list != null)
{
    if (list.Count > 0)
    {
        return list[0];
    }
}

但是每次您调用 FirstOrDefault() 时都会调用它。

此外,您还缺少"默认"情况。如果像第一个示例中那样链接方法,则可以获取列表是否为空NullReferenceException。因此,请确保通过查询返回某些内容:

var item = Item.FirstOrDefault();
if (item == null)
    return; // or throw
item.Qty = qtyToUpdate;
var uitem = UItem.FirstOrDefault();
if (uitem == null)
    return; // or throw
item.TotalPrice = uitem.Qty * uitem.Price;

还有一点需要注意 - 如果你对内存中收集执行FirstOrDefault(),则性能几乎没有差异。但是,如果您执行它而不将查询结果保存到列表中,差异将是巨大的。在这种情况下,每个FirstOrDefault()调用会导致新的数据库查询