Используя Entity Framework, как фильтровать по внешнему ключу, используя несколько значений перечисления?

Две таблицы (MainTable и EventType). EventType представлен в коде как перечисление и имеет внешний ключ в базе данных, чтобы он выглядел следующим образом;

Public enum EventTypeId As Integer
    Blah = 1
    Blurgh = 2
    Whoo = 3
End Enum

Я могу нормально выполнить следующий запрос;

From M in dbx.MainTable Where M.EventType.EventTypeId = 1

Но я не могу этого сделать (псевдокод);

From M in dbx.MainTable Where M.EventType.EventTypeId.Contains(EventTypeId.Blah,EventTypeId.Whoo)

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

Это текущая версия EF, а не .Net 4.0.

Таким образом, то, что я хочу сделать в SQL, легко, это просто должно быть в EF;

Select * From MainTable Where EventTypeId In (1,3);

person Ryan O'Neill    schedule 24.02.2010    source источник
comment
Я нашел похожий вопрос об операторе IN в LINQ.   -  person p2u    schedule 24.02.2010


Ответы (2)


Если вы посмотрите на то, что вы хотите:

Таким образом, то, что я хочу сделать в SQL, легко, это просто должно быть в EF;

Select * From MainTable Where EventTypeId In (1,3);

вы должны объяснить это так: EventTypeId должен быть частью (1,3). Эквивалент для этого: (1,3) содержит EventTypeId

То, что вы пытаетесь:

Но я не могу этого сделать (псевдокод)

From M in dbx.MainTable Where M.EventType.EventTypeId.Contains(EventTypeId.Blah,EventTypeId.Whoo)

Но тогда вы пытаетесь: EventTypeId содержит (1,3)

Решение состоит в том, чтобы сделать то, что вы действительно хотите в SQL, в синтаксисе contains, но изменить его: вы должны искать (1,3) contains EventTypeId

Поэтому создайте список int с конкретным идентификатором EventType, который вы ищете. А затем отфильтруйте все записи, где EventTypeId является частью списка идентификаторов.

List<int> eventTypeIds = new List<int>();
eventTypeIds.Add((int)EventTypeId.Blah);
eventTypeIds.Add((int)EventTypeId.Whoo);

From M in dbx.MainTable Where eventTypeIds.Contains(M.EventTypeId)
person Dacker    schedule 07.02.2017

Никогда не пробовал что-то подобное, но проверяли ли вы, работает ли оно, приводя ваши перечисления к целым числам, как показано ниже?

(int)EventTypeID.Blah

Извините, я не могу помочь больше, чем это, не попробовав для себя, что сейчас невозможно.

person wintermute    schedule 24.02.2010
comment
Нет, он тоже ненавидит это, поскольку пытается сделать это на стороне базы данных и жалуется, что не знает о типе. - person Ryan O'Neill; 24.02.2010