2013-06-07 3 views
0

Я конвертирую приложение ADO.NET для использования Entity Framework 5 и сталкиваюсь с проблемой при повторной записи функции поиска. Я отделил уровень пользовательского интерфейса и БД, уровень БД теперь имеет внутренний edmx и предоставляет методы поиска данных.Результаты фильтрации с помощью LINQ

Один такой способ - поиск. Поскольку функция больше не имеет доступ к образованию контрольных значений непосредственно (Там раньше была LINQ запроса на пользовательском интерфейсе файла кода) Я создал класс, чтобы разрешить форму, чтобы передать эти значения через

public class SearchParameter 
{ 
    public string Name { get; set; } 
    public bool Checked { get; set; } 
    public object Value { get; set; } 
} 

I знаю, что это приводит к боксу значение, но я не мог видеть любой другой способ, чтобы позволить нескольким типам значений

функция поиска выглядит следующим образом

public static IList SearchRecords(IList<SearchParameter> searchParams) 
{ 
    using (var db = new EarnieEntities()) 
    { 
     var result = db.Non_Conformance; 

     //Filter Results based on params 
     foreach (var p in searchParams.Where(p => p.Checked)) 
     { 
      switch (p.Name) 
      { 
       case "NCID": 

        break; 
       case "DateRaised": 

        break; 
       case "RaisedBy": 

        break; 
       case "RaisedFor": 

        break; 
      } 
     } 

     return result.ToList(); 
    } 
} 

с помощью LINQ к SQL с каждым из этих КАС эс я мог бы написать что-то вроде этого, чтобы фильтровать результат по этому полю

result = result.Where(x => x.NC_ID == (int) p.Value).Select(x => x); 

Идея при использовании LINQ для SQL было использовать отложенную загрузку и позволить всем фильтрации до того были доступны результаты. Это позволяет пользователям выбирать поля в пользовательском интерфейсе и строить критерии поиска.

С EF, я получаю

Вы не можете преобразовать тип источника Linq.IQueryable < Типа> целевого типа Data.Entity.DbSet < Тип>

Есть еще один способ сделать такая фильтрация?

[Update]

Если я пытаюсь просто привести результат к DbSet я получаю другую ошибку

Невозможно привести объект типа «System.Data.Entity.Infrastructure.DbQuery 1[EarnieDAL.Sources.Non_Conformance]' to type 'System.Data.Entity.DbSet 1 [EarnieDAL.Sources.Non_Conformance]

+2

К сожалению, я не могу проверить это сейчас, но что, если заменить «результат вар = db.Non_Conformance;» с var 'result = db.Non_Conformance.Select (x => x);' – Uriil

+0

* facepalm * Попробуем сейчас, но я считаю, что это – James

+0

Большое спасибо Uriil, Spot on. – James

ответ

3

причина, почему вы получаете эту ошибку, потому что вы инициализирован «результат» как DbSet, а затем попытаться назначить IQueryable к нему позже.

Вы можете инициализировать результат с помощью result = db.Non_Conformance.AsQueryable()

+0

Я еще не могу добавить комментарий к вашему вопросу, но Уриэль прав. Это тот же результат, что и в первой части моего ответа, но я думаю, что AsQueryable() может быть лучшим решением? –

+0

+1 для первой части. Второй вариант не будет работать, поскольку коммутатор находится внутри цикла foreach (ему необходимо постепенно объединять IQueryables, поэтому он не может начинаться со свежего на каждой итерации). –

+0

Второй вариант будет обходить ленивую загрузку путем внесения в список. Это заставило бы меня отбросить все и фильтр THEN. Первый вариант - пятно на tho. – James

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