2014-02-12 1 views
0

У меня есть база данных в Azure, которую я создал с нуля (не используя код сначала в EF) и сделал столбец в одной из моих таблиц для представления Enum из моих классов C#.(Linq & EF) Где MyType = (int) Enum не работает

Перечисление является

public enum ItemType 
{ 
    Build, 
    Stock, 
    Shell, 
    Parts, 
    [Display(Name="All Vehicles")] 
    AllTypesOfVehicles 
} 

Я пытаюсь выбрать определенные записи в качестве EF Linq запросов с помощью этого перечисления в ИНЕКЕ. Я просто перечислил перечисление в его базовый тип данных int32, но он не возвращает мне результаты, которые я хочу.

var results = context.Items.Include(P => P.Manufacturer) 
        .Include(P => P.Category).Include(P => P.VehicleMake) 
        .Include(P => P.VehicleModel).Include(P => P.VehicleYear); 

//Fetches specific type of item 
if (TypeOfPart != StaticData.ItemType.AllTypesOfVehicles) 
{ 
    results.Where(P => P.Type == (int)TypeOfPart); //This does not work 
} 
else //fetches all vehicle types 
{ 
    results.Where(P => P.Type == 0 | P.Type == 1 | P.Type == 2); 
} 

Ожидается ли это в EF? Я знаю, что EF поддерживает Enum с первого подхода кода, но я не понимаю, почему это может вызвать проблему. Я вошел в свой портал Azure и написал ручной запрос, чтобы узнать, получу ли я результаты, которые я хотел, и я это сделал.

SELECT * FROM Items WHERE Type = 2 

Это дало мне только результаты, которые были перечислены типа «Шелл». Даже hardcoding число 2 в предложение where в моем EF-запросе не дает мне результатов, которые я хочу. Я перепроверил свой код, чтобы убедиться, что я не переопределяю, что где-то где-то еще, и все кажется чистым. Просто, чтобы быть уверенным, что я даже позвонил .ToList() сразу после предложения where, но все еще получил плохие результаты.

Я не совсем уверен, что мне здесь не хватает ???

============ Редактировать после первого ответа =======================

var results = context.Items.Include(P => P.Manufacturer) 
        .Include(P => P.Category).Include(P => P.VehicleMake) 
        .Include(P => P.VehicleModel).Include(P => P.VehicleYear); 

       //Fetches specific type of item 
       if (TypeOfPart != StaticData.ItemType.AllTypesOfVehicles) 
       { 
        var part = (int)TypeOfPart; 
        results.Where(P => P.Type == part); 
        List<Item> t = results.ToList(); 
       } 
       else //fetches all vehicle types 
       { 
        results.Where(P => P.Type == 0 | P.Type == 1 | P.Type == 2); 
       } 

Wrong results

ответ

0
  1. Вы должны назначить results.Where() обратно results, чтобы заставить его работать, и попытайтесь выполнить бросок за пределами EF контекста запроса:
//Fetches specific type of item 
if (TypeOfPart != StaticData.ItemType.AllTypesOfVehicles) 
{ 
    var part = (int)TypeOfPart; 
    results = results.Where(P => P.Type == part); //This does not work 
} 
else //fetches all vehicle types 
{ 
    results = results.Where(P => P.Type == 0 | P.Type == 1 | P.Type == 2); 
} 

И кстати, если вы просто пропустите P.Type, связанный с Where, когда вы пытаетесь взять все типы транспортных средств? Это означало бы, что вам не нужно else.

//Fetches specific type of item 
if (TypeOfPart != StaticData.ItemType.AllTypesOfVehicles) 
{ 
    var part = (int)TypeOfPart; 
    results.Where(P => P.Type == part); //This does not work 
} 
+0

№ У меня есть транспортные средства и предметы в одном и том же столе. Они имеют одинаковые столбцы. Я различаю их, используя этот перечислитель, так что 0-2 - это разные типы транспортных средств, а 3 - предметы (автозапчасти) и 4 (никогда не сохраняется в db) просто означает выбор частей с значениями перечисления 0-2. Я обновил свой вопрос в соответствии с вашим ответом. Как видно на снимке экрана, переменная part имеет значение 0, но моя первая сущность имеет значение «Тип» 1. Я также вызывал список сразу после предложения where, чтобы устранить возможные кодовые икоты. – Adrian

+0

Хорошо, я вижу, где проблема. 'results.Where()' не редактирует 'results' - он возвращает новый запрос с дополнительным условием. Вы должны вернуть его к «результатам», чтобы заставить его работать. – MarcinJuraszek

+0

** Face Palm ** Ты потрясающий. – Adrian

Смежные вопросы