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

时间:2009-08-20 10:33:43

标签: c# linq linq-to-sql 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

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

由于

8 个答案:

答案 0 :(得分:12)

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

根据可读性,对个别情况使用查询表达式或点表示法。对于连接,我发现点符号非常麻烦 - 但我用它只有一个或两个子句(通常在/ 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 to Objects,LINQ一无所知到SQL等;这只是遵循适当模式的情况。这是一个很好的设计,这意味着查询表达式只会影响语言规范的一小部分。

答案 1 :(得分:3)

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

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

另见this SO question

答案 2 :(得分:2)

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

答案 3 :(得分:2)

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

答案 4 :(得分:1)

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

答案 5 :(得分:1)

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

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

答案 6 :(得分:0)

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

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

答案 7 :(得分:0)

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

IQueryable<IncomeDetailsEntity> 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 });