0

Я пытаюсь построить метод расширения для IQueryable, который принимает направление сортировки в качестве аргумента. Я хочу иметь возможность применить этот метод к запросам SQL-сервера с помощью EF. Вот то, что я до сих пор:Поиск соответствующего типа возвращаемого значения для общих функций linq to SQL

public static class QueryableExtensions 
{ 
    public static IOrderedQueryable<T> ApplyOrdering<T>(this IQueryable<T> source, Expression<Func<T, Object>> lambda, bool ascending) 
    { 
     return ascending ? source.OrderBy(lambda) : source.OrderByDescending(lambda); 
    } 
} 

Я следующий код драйвера:

[Table("TestTable")] 
public partial class TestTable 
{ 
    [Key] 
    public int IntVal { get; set; } 
} 

public partial class Model1 : DbContext 
{ 
    public Model1() 
     : base("name=Model1") 
    { 
    } 

    public virtual DbSet<TestTable> TestTables { get; set; } 
} 

class Program 
{ 
    private static void Main(string[] args) 
    { 
     var context = new Model1(); 
     var baseQuery = from entity in context.TestTables 
          select entity; 

     var sortedByInt = baseQuery.ApplyOrdering(x => x.IntVal, true).ToList(); 
    } 
} 

Однако выполнение этого кода приводит к следующей ошибке:

Unable to cast the type 'System.Int32' to type 'System.Object'. LINQ to Entities only supports casting EDM primitive or enumeration types.

Есть работать вокруг? Я подозреваю, что мне нужен альтернативный тип возврата для выражения.

ответ

1

Try:

public static class QueryableExtensions 
{ 
    public static IOrderedQueryable<T> ApplyOrdering<T, TProp>(this IQueryable<T> source, Expression<Func<T, TProp>> lambda, bool ascending) 
    { 
     return ascending ? source.OrderBy(lambda) : source.OrderByDescending(lambda); 
    } 
}