2014-01-15 6 views
0

У меня есть это SQL заявлениеLinq внешнее соединение и группа по со счетом в выберите

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()

ответ

3

Этого следует ожидать, поскольку нет группы, которая имела бы Count из 0 (потому что в этом случае группа не существовала бы в первую очередь) ,

Вам необходимо изменить селектор групп, чтобы убедиться, что итоговый счет учитывает тот факт, что фотография может быть нулевой. Это немного сложнее, чем в SQL, поскольку столбцы с шифрованием (например, int) будут иметь значения по умолчанию вместо null. Вам нужно будет проверить, сравнивая столбцы с нулевым столбцом с нулевым (как я делаю ниже, так как я предполагаю, что Uploader не имеет значения NULL), или вам придется сравнивать столбцы с нулевым значением против невозможного значения (скажем, сравнивая столбец идентификатора со значением вне его диапазона, возможно, -1).

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

только то, что я хотел. Благодаря! PS: это i.Uploader! = Null –

+1

Хороший улов; исправленный. Если это ответили на ваш вопрос, пожалуйста, не забудьте нажать галочку, чтобы принять его. –

Смежные вопросы