2012-01-27 3 views
0

У меня есть следующий запрос, который получает список идентификаторов, и я хочу сделать подсчет. Существует также объектная модель CountModel, которая содержит подсчеты с каждым свойством, определенным как int.группировка и подсчет в linq-to-sql

public class GetCountByStatus(List<int> TheIDs) 
{ 
...using MyDC... 
var CountData = (from d in MyDC.Data 
        where TheIDs.Contains(d.ID) 
        group d by d.Status into statusgroup 
        select new CountModel() 
        { 
        CountStatus1 = (from g in statusgroup 
            where g.Status == 1 
            select g).Count(), 

        CountStatus2 = (from g in statusgroup 
            where g.Status == 2 
            select g).Count(), 

        CountStatusN = .... 

        }).Single(); 

Если, например, нет никаких элементов со статусом N, будет этот код аварии или будет счетчик быть 0 для CountStatusN? Это лучший способ сделать то, что я хочу?

Спасибо.

ответ

1

Count() всегда будет возвращать целое число, которое равно 0, если нет элементов с данным статусом. Поэтому CountStatusN всегда будет целым числом.

2

Я бы для словаря вместо этого, попробовать что-то вроде этого:

var countData = MyDC.Data.Where(y => TheIDs.Contains(y.ID)) 
    .GroupBy(y => y.Status).ToDictionary(y => y.Key, y => y.Count()); 

я не пробовал мой сам и не писал код в VS, но я думаю, что это почти как вы можете сделай это. Это даст вам словарь, где ключ - это статус, а значение - это количество этого состояния.

Определение модели со свойствами с именем SomethingX не очень гибкое. Это означает, что вы должны изменить модель, когда есть новый статус. Сохранение данных в словаре вместо этого избавит вас от этого.