哪一个是更好的lambda表达式或

我有遵循LINQ to SQL查询表达式

from msg in TblUserMessages join user in Aspnet_Users on msg.FromUserID equals user.UserId select new { msg.FromUserID, msg.ToUserID, msg.MessageLocationID, msg.MessageID, user.UserName } 

并遵循LINQ方法表达式:

 TblUserMessages .Join ( Aspnet_Users, msg => msg.FromUserID, user => user.UserId, (msg, user) => new { FromUserID = msg.FromUserID, ToUserID = msg.ToUserID, MessageLocationID = msg.MessageLocationID, MessageID = msg.MessageID, UserName = user.UserName } ) 

这两个都返回相同的结果集。 这是例如:

 82522f05-2650-466a-a430-72e6c9fb68b7 6b2a174a-8141-43d2-b3ad-5b199bcbfcae 1 1 waheed 

哪一个更好用。 第一个或SECOND个。

谢谢

它们是等价的。 它们不仅返回相同的结果集 – 它们编译为相同的代码。

根据可读性,对个别情况使用查询表达式或点表示法。 对于连接,我发现点符号非常麻烦 – 但我用它只有一个或两个子句(通常在/ select)的情况。 即使有两个子句(通常在哪里选择),如果你还需要使用它,我会发现点符号很好。 例如,我喜欢:

 var query = people.Where(person => person.Age > 18) .Select(person => person.Name) .Skip(100) .Take(10); 

过度

 var query = (from person in people where person.Age > 18 select person.Name) .Skip(100) .Take(10); 

对于更复杂的查询(例如连接),我可能只是将两者分开:

 var baseQuery = from person in people where person.Age > 18 join company on person.CompanyId equals company.CompanyId select new { person.Name, company.Name }; var fullQuery = baseQuery.Skip(100) .Take(10); 

我发现这种分离使它更容易阅读。

LINQ相信,对于开发人员来说,至少了解查询表达式的基本知识是非常有用的 – 事实上它们基本上都是转换为点符号,而且语言本身对LINQ to Objects,LINQ to SQL等一无所知。 ; 这只是遵循适当模式的情况。 这是一个很好的设计,这意味着查询表达式只影响语言规范的一点点。

没有更好的了。 用你喜欢的。 在这种情况下,我会使用’query’语法,因为我认为它比第二个更可读。 此外,既然我们正在编写SQL,我认为这种语法更适合它。 但我相信其他人会不同意并倾向于选择lamda版本。

通常使用后一种语法btw,因为我更喜欢lambda语法,因为它通常更具可读性和更短。

另见这个问题 。

我总是选择更具可读性的选项,在这种情况下我认为它是LINQ片段。

两者都表现同样出色,但我更喜欢第一部,因为它更容易阅读和理解。

无论你发现哪个更容易阅读。

“编写代码,然后测量它以找出要重构的内容。” 你有两个衡量标准吗? 更好是主观的。

您是否发现任何一个问题让您想要选择一个而不是另一个?

这两种语法之间有一点差别。 查询表达式将需要更长的时间来编译,因为编译器必须将其转换为点语法。 当然,它几乎完全无关紧要,因为:

  1. 编译覆盖很少,
  2. 运行时需要处理的发出的IL对于两种情况都完全相同。

当我必须动态构建查询时,我使用Lambda表达式,当查询完全已知时,我使用LINQ to SQL。

 IQueryable query; if (!string.IsNullOrEmpty(regioncode)) { if (!string.IsNullOrEmpty(compcode)) { query = db.IncomeDetailsEntities.Where(i => i.RegionCode == regioncode && i.CompanyCode == compcode); } else { query = db.IncomeDetailsEntities.Where(i => i.RegionCode == regioncode); } } else { query = db.IncomeDetailsEntities; } return query.Select(i => new { i.RegionCode, i.Budget });