linq to sql "All" запрос типа оператора - PullRequest
1 голос
/ 20 сентября 2011
String[] codes = new[] {"C1", "C2" }

Ниже приведена схема для SomeEntity

fkey  code
--------------
f1    C1
f1    C2
f2    C2
f2    C3
f2    C4
f3    C5

Мне нужно написать запросы, которые могут получить все сущности на основе 2 условий -

1) имеет ли организация какой-либо из кодов 2) имеет ли организация все коды

Below is what i wrote for 1st condition
-----------------------------------------
from f in dc.GetTable<SomeEntity>
where codes.Contains(f.code)
select f;

Я пытался написать 2-ю кодировку, используя оператор All, но оператор "All" недопустим для linq to sql.

Вопрос : Как написать запрос, который будет возвращать только те объекты, которые имеют все коды?

Ответы [ 2 ]

0 голосов
/ 20 сентября 2011

Попробуйте это.

  • Группировка по fkey (которая создаст отдельные fkeys)
  • Фильтр групп где
    • Все члены списка кодов содержатся в кодах этой группы

См. Ниже

var matching = dc.GetTable<SomeEntity>()
    .GroupBy(e => e.fkey)
    .Where(group => codes.All(c => 
        group.Select(g => g.code).Contains(code)))
    .Select(group => group.Key);
0 голосов
/ 20 сентября 2011
var codeCount = dc.GetTable<SomeEntity>.Distinct(e => e.Code);
var matching = (from f in dc.GetTable<SomeEntity>
   group f by f.Key into grouped
   select new { f.Key, values = grouped}).Where(v => v.values.Count() == codeCount);

Вероятно, отвратительный запрос, хранимый процесс, сопоставленный с функцией в контексте данных, может быть лучшим решением, если честно

Возможно, вы могли бы сделать codeCount как разрешить привязку в запросе и переноситьв операторе linq, а не закрывать .Where вызов.Не уверен, что это сделает его более производительным, но сэкономит дополнительную поездку в DB

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