【问题标题】:Which one is better lambda expressions or [closed]哪个是更好的 lambda 表达式或 [关闭]
【发布时间】:2010-11-21 06:34:09
【问题描述】:

我有以下 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 一。

谢谢

【问题讨论】:

    标签: c# linq linq-to-sql lambda


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

      没有更好的。用你喜欢的。在这种情况下,我会使用“查询”语法,因为我认为它比第二种更具可读性。此外,由于我们无论如何都在编写 SQL,我认为这种语法更类似于它。但我相信其他人会不同意并倾向于选择 lamda 版本。

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

      另见this SO question

      【讨论】:

      • lambda 表达式并不短。如果我有更多的连接,那么它会变得非常长。我想你会同意我的。
      • 是的,我同意。这就是为什么我说'(...) 通常更具可读性和更短':)
      【解决方案3】:

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

      【讨论】:

        【解决方案4】:

        两者的表现都一样好,但我更喜欢第一个,因为它更容易阅读和理解。

        【讨论】:

          【解决方案5】:

          你觉得哪个更容易阅读。

          【讨论】:

            【解决方案6】:

            “编写您的代码,然后对其进行测量以找出要重构的内容。”两个都测了吗? 更好是主观的。

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

            【讨论】:

              【解决方案7】:

              这两种语法有一点区别。查询表达式一将花费 longer 编译,因为编译器必须将其转换为点语法。当然,这几乎完全无关紧要,因为:

              1. 编译开销很小,
              2. 在两种情况下,运行时需要处理的发出的 IL 完全相同。

              【讨论】:

                【解决方案8】:

                当我必须动态构建查询时,我使用 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 });
                

                【讨论】:

                  猜你喜欢
                  • 2010-12-02
                  • 2011-11-22
                  • 1970-01-01
                  • 2011-03-19
                  • 2011-01-05
                  • 2010-11-24
                  • 2013-08-14
                  • 1970-01-01
                  • 1970-01-01
                  相关资源
                  最近更新 更多