Linq外部加入和分组由选择中的计数

时间:2014-01-15 17:37:08

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

我有这个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;
    }

但我从Count()

返回的所有用户都没有照片

1 个答案:

答案 0 :(得分:3)

这是可以预期的,因为没有任何组Count为0(因为在这种情况下,该组首先不存在)。

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

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