可以将此LINQ表达式从方法语法转换为查询语法吗?

时间:2011-02-03 13:46:42

标签: c# .net linq

我正在尝试将此LINQ方法表达式转换为等效的查询语法:

var results1 =
    logins.GroupBy(loginDate => loginDate.Date)
        .Select(loginDates => new
            {
                Date = loginDates.Key,
                Count = loginDates.Select(login => login.Name).Distinct().Count()
            });

首先,我采用了这种语法,它确实提供了相同的结果,但实际上并不相同。

var results2 =
    from loginDate in logins
    group loginDate by loginDate.Date
    into loginDates
    select new
        {
            Date = loginDates.Key,
            Count = (from login in loginDates group login by login.Name).Count()
        };

不同之处在于我在这里使用group by语句,它与distinct不同(尽管它确实提供了相同的结果)。然后我尝试了这个:

var results3 =
    from loginDate in logins
    group loginDate by loginDate.Date
    into loginDates
    select new
        {
            Date = loginDates.Key,
            Count = (from login in loginDates select login.Name).Distinct().Count()
        };

但是,此代码再次使用了一些方法语法。

这是我最后一个例子,你能得到的最好的?或者是否可以使用更少的方法语法和更多的查询语法来重写查询?


logins初始化如下:

var logins = new[]
                 {
                     new {Name = "james", Date = new DateTime(2011, 01, 01)},
                     new {Name = "jamie", Date = new DateTime(2011, 01, 01)},
                     new {Name = "alex", Date = new DateTime(2011, 01, 01)},
                     new {Name = "james", Date = new DateTime(2011, 1, 1)},
                     new {Name = "matt", Date = new DateTime(2011, 1, 2)},
                     new {Name = "jamie", Date = new DateTime(2011, 1, 2)},
                     new {Name = "alex", Date = new DateTime(2011, 1, 2)},
                     new {Name = "james", Date = new DateTime(2011, 1, 2)},
                     new {Name = "james", Date = new DateTime(2011, 1, 2)}
                 };

2 个答案:

答案 0 :(得分:4)

Distinct没有查询表格(请参阅此post了解原因)。 group by的查询语法在语义上是等效的,如果你想在查询表单中使用它,我就会使用它。

答案 1 :(得分:1)

afaik,LINQ查询语法没有Distinct()等价物。 Count()Sum()等都不是。所以你必须结合方法/查询语法或只使用方法。