2013-10-26 3 views
0

Я написал запрос LINQ, что это результат похож на это:Получить количество записей па группы в LINQ

var res = from a in tbl 
      group a by {a.StateCode,a.CityCode} into grp 
      //where grp.Count() == 1 
      select ... 

StateCode  CityCode   ...... 
------------------------------------------ 
01    001    ...... 
01    002    ...... 
02    001    ...... 
03    001    ...... 
03    002    ...... 
03    003    ...... 

действительно я хочу, чтобы получить только 02 001 запись, потому что у него есть один результирующий ряд в конечном итоге. Если я добавлю комментированный код, он возвращает количество записей, соответствующих каждой группе, не считая собственной группы. Я знаю, что могу сделать это с двумя group by, но есть ли лучший способ получить строку, которая имеет (например) одну строку в результате?

+0

не то, что вы хотите '02 001', потому что' 02' присутствует только один раз в ' StateCode'? Если вам так просто нужно «группировать по StateCode» и выбирать только 1 из групп из 1 элемента, потому что в вашем примере может быть больше групп из 1 элемента, это просто '02'. –

+0

Да, есть больше, чем '02'. проблема в том, что я хочу получить '02' и' 001' для состояния '02'. с группой я могу получить один из них и подсчет другого. – Arian

ответ

0

Как об этом:

(from b in Tbls 
where (from a in Tbls 
     where a.StateCode == b.StateCode 
     group a by a.StateCode into grp 
     where grp.Count() == 1 
     select grp).Count() > 0 
select b).Dump(); 

Вот SQL я использовал, чтобы проверить его с:

create table tbl (StateCode varchar(5), CityCode varchar(5)) 

insert tbl values ('01', '001') 
insert tbl values ('01', '002') 
insert tbl values ('02', '001') 
insert tbl values ('03', '001') 
insert tbl values ('03', '002') 
insert tbl values ('03', '003') 
+0

Извините, это опечатка – Arian

+0

Это определенно работает, но что вы пытаетесь выбрать? Вы можете сделать '' select grp'', но не '' select a''. Если вам нужно выбрать целую строку, вам понадобится более сложный запрос. – acfrancis

+0

Служит мне для того, чтобы не читать внимательно. Я обновил свой ответ. – acfrancis

1

Вы группирование по StateCode и CityCode поэтому каждая группа имеет только один элемент. Вы должны группировать только StateCode и снова добавлять where grp.Count() == 1.

Каждая группа содержит StateCode как свой ключ и перечисление элементов. Так как вы уже отфильтрованы для групп только с аа одного элемента, вы можете просто вернуть первый из каждой группы:

var res = from a in tbl 
      group a by a.StateCode into grp 
      where grp.Count() == 1 
      select grp.FirstOrDefault(); 
Смежные вопросы