【问题标题】:Linq outer join and group by with count in selectLinq 外连接和分组,在选择中计数
【发布时间】:2014-01-15 17:37:07
【问题描述】:

我有这条 SQL 语句

SELECT 
    users.UserName, COUNT(photos.Id) AS 'photos' 
FROM photos 
RIGHT JOIN users ON photos.UploaderId = users.Id 
GROUP BY users.UserName`

我尝试构建这个 linq 查询

    protected void LinqDataSource1_Selecting(object sender, LinqDataSourceSelectEventArgs e)
    {
        var appContext = new ApplicationDbContext();
        var x = from u in appContext.Users
                join p in appContext.Photos on u equals p.Uploader into ps
                from sp in ps.DefaultIfEmpty()
                group ps by u into g
                select new { Username = g.Key.UserName, Photos = g.Count() };
        e.Result = x;
    }

但我得到所有没有照片的用户,其中 1 从 Count() 返回

【问题讨论】:

    标签: c# .net sql-server database linq


    【解决方案1】:

    这是意料之中的,因为没有任何组的 Count 为 0(因为在这种情况下,该组一开始就不存在)。

    您需要修改您的组选择器,以确保结果计数考虑到照片可能为空的事实。这比 SQL 稍微复杂一些,因为值类型的列(如 int)将具有默认值而不是 null。您需要通过将不可为空的字符串列与 null 进行比较来进行检查(如下所示,因为我假设 Uploader 不可为空),或者您必须将不可为空的列与不可能的值进行比较(例如,将标识列与其范围之外的值进行比较,可能是 -1)。

    select new 
    { 
        Username = g.Key.UserName, 
        Photos = g.Where(i => i.Uploader != null).Count() 
    };
    

    【讨论】:

    • 正是我想要的。谢谢! PS:是 i.Uploader!=null
    • 好收获;更正。如果这回答了您的问题,请不要忘记单击复选标记以接受它。
    猜你喜欢
    • 1970-01-01
    • 2016-08-27
    • 2010-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多