【问题标题】:How do I write this SQL query using Linq/Lambda?如何使用 Linq/Lambda 编写此 SQL 查询?
【发布时间】:2013-04-30 03:40:49
【问题描述】:

到目前为止,我只使用 lambda 编写简单的查询,例如 (c => c.UserID == uID) 等,但现在我有一个更高级的 SQL query。我希望针对我使用Entity Framework 创建的模型运行。

问题是我无法弄清楚如何在多个列上使用 group by 以及在列 ObjectGUID 上执行 distinct count。这是我在 SQL Server 管理工作室中运行时运行良好的 SQL 查询。

SELECT YEAR(logdate) as year, MONTH(logdate) as month, COUNT(distinct ObjectGUID) as ammount
FROM table
WHERE ExportTemplate = 'template' AND LogDate >= '2008-01-01 00:00:00:000'
GROUP BY YEAR(logdate), MONTH(logdate)
Order By YEAR(logdate), MONTH(logdate)

将它与 linq 结合起来更好还是可以全部通过 lambda 表达式来完成?任何帮助将不胜感激

【问题讨论】:

    标签: c# linq entity-framework lambda group-by


    【解决方案1】:

    您需要为分组创建新的匿名类型;

    from x in Model
    group by new { x.Date.Year, x.Date.Month } into g
    order by g.Key.Year, g.Key.Month
    select new
    {
        g.Key.Year,
        g.Key.Month,
        Count = g.Select(s => s.ObjectGUID).Distinct().Count()
    }
    

    像这样的东西应该可以解决问题(虽然未经测试)。添加where 条件应该很容易。

    【讨论】:

    • 我收到此错误:无效的匿名类型成员声明符。必须使用成员分配、简单名称或成员访问来声明匿名类型成员。这是针对不同的计数线
    • 是的,可能是由于未命名属性 - 现在尝试,添加 Count 作为属性名称
    • 谢谢。有用!现在我需要把它放在一个模型中以供视图 hmm :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-06-05
    相关资源
    最近更新 更多