Как обнаружить несуществующие строки в linq? - PullRequest
1 голос
/ 10 ноября 2011

У меня есть фрагмент кода, похожий на этот:

select p.Make, count(p.Make) as _count
from Products p
where p.GroupId = @GroupId
group by p.Make

полный набор результатов будет что-то с 5 строками:

Make    _count
``````````````
Make1    32
Make2    54
Make3    60
Make4    09
Make5    47

В C # я пытаюсь рассчитать проценты для каждой марки (предположим, что я уже знаю общее количество продуктов), чтобы я мог построить диаграмму изображений Google (круговую диаграмму), поэтому мне нужно передать 5 значений.

Я пытаюсь сделать это:

int Make1Count = from row in DataSetProducts.tables[0].AsEnumerable()
                 where row.Field<string>("Make") == MyEnum.Makers.Make1.ToString()
                 select row.Field<int>("_count");

и т. Д. До Make5Count. В идеале у меня должно быть 5 результатов, но это не всегда так, иногда результат выглядит так:

Make    _count
``````````````
Make1    32 
Make4    09
Make5    47 

Но мне все еще нужны Make2 и 3 (они просто равны нулю)

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

примечание 1) В моей базе данных нет списка всех производителей, поэтому я не могу объединить это с чем-либо

примечание 2) Здесь я избегал Convert.toInt32 как раз перед from row in ..., чтобы сделать его понятным

это должно быть довольно тривиально, но я не могу как-то это понять.

Ответы [ 3 ]

3 голосов
/ 10 ноября 2011

Во-первых, похоже, что вы пытаетесь выбрать одну строку (из вашего примера sql и linq), но ваш linq возвращает несколько строк .. Вместо этого попробуйте следующее:

int Make1Count = (from row in DataSetProducts.tables[0].AsEnumerable()
             where row.Field<string>("Make") == MyEnum.Makers.Make1.ToString()
             select row.Field<int>("_count"))
             .SingleOrDefault();

Это должно вернутьодна строка, и решить одну проблему.

Теперь, для вашей реальной проблемы, когда какой-либо строки не существует, SingleOrDefault() вернет значения по умолчанию для типов данных, проверьте это с этим.Например, по умолчанию значение int равно 0, что вам нужно, а по умолчанию для bool - false и т. Д.

0 голосов
/ 10 ноября 2011

Как насчет чего-то вроде

var counts = DataSetProducts.tables[0].Select(row => 
                 make = row.Field<string>("Make"),
                 count = row.Field<int>("_count"));

int Make1Count = counts.SingleOrDefault(c => 
                     c.make == MyEnum.Makers.Make1.ToString()).count; 
0 голосов
/ 10 ноября 2011

измените свой sql на следующий, выберите X.Make, count (X.Make)

(

(выберите p.Make, count (p.Make) как _count из Products p, гдеp.GroupId = @GroupId group by p.Make) t1

union select 'Make1', 0

union select 'Make2', 0

union select 'Make3', 0

объединение выбора 'Make4', 0

объединение выбора 'Make5', 0)

X

группировка по X.Make

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...