在LINQ Select中多次调用First()是否有害?

3
我有一个LINQ语句,我想将第一个地址与昵称为“Me”的地址合并。
using (var ctx = new DataEntities())
{
  return from c in ctx.Customers.Include("Addresses")
         let m = from a in c.Addresses where a.Nickname == "Me" select a
         where m.Any()
         select new
         {
           Id = c.CustomerId,
           m.First().Name,
           m.First().Address1,
           m.First().Address2,
           m.First().City,
           m.First().State,
           m.First().Zip,
           m.First().Email,
           m.First().PhoneNumber
         };
}

我在想:

  1. 如果我像这样多次调用First,会影响性能吗?
  2. 有更好的LINQ语句吗?
  3. 我也意识到,我需要 .Include("Addresses") 吗?
1个回答

10

对于LINQ to SQL,EF等情况,这可能并不重要 - 完全有可能TSQL转换会使它们变得相同。当然,你可以进行性能分析以确定;-p

但对于LINQ-to-Objects(非常字面的),就会有所影响。您可以通过使用let来改善这种情况:

return from c in ctx.Customers.Include("Addresses")
     let m = from a in c.Addresses where a.Nickname == "Me" select a
     where m.Any()
     let first = m.First()
     select new
     {
       Id = c.CustomerId,
       first.Name,
       first.Address1,
       ...
       first.PhoneNumber
     };

根据这个注释,我能否让“我”等于c.Addresses.FirstOrDefault(a.Nickname == "Me")吗? - bendewey
当 me != null 时进行比较。 - bendewey
仅供记录,我正在使用LINQ to EF。 - bendewey
使用 EF,您可以尝试各种布局 - 看看哪种 TSQL 让您最满意。 - Marc Gravell
EF将为每个.First()调用创建一个子查询。使用let表达式会更好地查询。 - Matthew Whited

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接