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

Wah*_*eed 2 c# linq lambda linq-to-sql

我有遵循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
       }
Run Code Online (Sandbox Code Playgroud)

并遵循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
     }
)
Run Code Online (Sandbox Code Playgroud)

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

82522f05-2650-466a-a430-72e6c9fb68b7
6b2a174a-8141-43d2-b3ad-5b199bcbfcae
1
1
waheed
Run Code Online (Sandbox Code Playgroud)

哪一个更好用.在FIRST一个或SECOND一个.

谢谢

Jon*_*eet 12

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

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

var query = people.Where(person => person.Age > 18)
                  .Select(person => person.Name)
                  .Skip(100)
                  .Take(10);
Run Code Online (Sandbox Code Playgroud)

过度

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

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

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);
Run Code Online (Sandbox Code Playgroud)

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

我认为开发人员至少可以理解查询表达式的基本知识是非常有用的 - 事实上它们基本上是转换为点表示法,而且语言本身对LINQ to Objects,LINQ to SQL等一无所知. ; 这只是遵循适当模式的情况.这是一个很好的设计,这意味着查询表达式只影响语言规范的一小部分.