2014-10-08 3 views
0

Я пытаюсь сделать некоторую оптимизацию кода в своем приложении и заменить несколько методов, которые делают то же самое с одним. У меня есть этот LINQ, что мне нужно выполнить с различными фильтрами, но я получаю ошибки времени проектирования в .где (фильтр) частьДинамическое изменение Где фильтры в linq

 Expression<Func<dbTable, bool>> filter; 
     switch (i) 
     { 
      case 1: filter = (p => p.f1 == ExternalParam); 
      case 2: filter = (p => p.f2 == ExternalParam); 
     } 

     var ds = (from tbl in dbEntities.dbTable 

        orderby tbl.f1 

        select new 
        { 
         f1 = tbl.f1, 
         f2 = tbl.f2, 
         f3 = tbl.f3, 
         f4 = tbl.f4, 

        } 
        ).Where(filter); 

Ошибки

Error 1 'System.Linq.IQueryable<AnonymousType#1>' does not contain a definition for 'Where' and the best extension method overload 'System.Linq.Queryable.Where<TSource>(System.Linq.IQueryable<TSource>, System.Linq.Expressions.Expression<System.Func<TSource,int,bool>>)' has some invalid arguments  
Error 2 Argument 2: cannot convert from 'System.Linq.Expressions.Expression<System.Func<AppNameSpace.dbTable,bool>>' to 'System.Linq.Expressions.Expression<System.Func<AnonymousType#1,int,bool>>' 

Может кто-то помочь с этим?

+0

Я думаю, что вокруг круглых кронштейнов не должно быть (от..orderby..select) – Fratyx

ответ

4

Ну, ваше выражение имеет тип Expression<dbTable, bool>

и вы пытаетесь применить его к anonymous типа (когда вы делаете select new, вы осуществляете анонимного типа), который ... а не dbTable

Поэтому вы должны применить свой предикат к IQueryable<dbTable>: dbEntities.dbTable должен быть такого типа.

var ds = from tbl in dbEntities.dbTable.Where(filter) 

       orderby tbl.f1 

       select new 
       { 
        f1 = tbl.f1, 
        f2 = tbl.f2, 
        f3 = tbl.f3, 
        f4 = tbl.f4, 

       }; 

Кстати, мне легче избежать смешивания синтаксисов, когда это не нужно.

var ds = dbEntities.dbTable.Where(filter) 
          .OrderBy(m => m.f1) 
          .Select(m => new { 
           tbl.f1, 
           tbl.f2, 
           tbl.f3, 
           tbl.f4 
          }); 

Но эта часть - это всего лишь личное ПО.

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