Използвайки 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)

Вторият подход е по-четлив и поддържаем, тъй като се свързва с enum, но не мога да намеря конструкция в 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 в синтаксиса съдържа, но го обърнете: трябва да потърсите (1,3) съдържа 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
Не, мрази и това, тъй като се опитва да го направи db страна и се оплаква, че не знае за типа. - person Ryan O'Neill; 24.02.2010