LINQ Expression有助于Func TEntity,TType

时间:2010-12-29 14:44:42

标签: c# linq expression-trees

我有一个存储库方法,它接受以下形式的参数:

public IEnumerable<TEntity> Get<TEntity>(Expression<Func<TEntity,string>> orderBy)

现在,在尝试按字符串类型

的属性排序时工作正常
var entities = rep.Get(x => x.Name); 

但如果我想按double或int或任何其他类型排序会怎么样。

var entities = rep.Get(x => x.Price);这样的事情显然会引发编译错误,说我无法将double转换为字符串。

如何使这更通用,以便我可以按实体中的任何属性排序,或者至少是类型实现IComparable或类似的属性?

2 个答案:

答案 0 :(得分:2)

存储库类本身应该有一个类型参数。然后在访问存储库成员时不需要指定实体类型。像这样:

public interface IRep<TEntity>
{
    IEnumerable<TEntity> Get<TOrderBy>(
        Expression<Func<TEntity, TOrderBy>> orderBy
    );
}

示例实体类:

public class MyEntity
{
    public string Name { get; set; }
    public decimal Price { get; set; }
}

示例存储库实现:

public class Rep<TEntity> : IRep<TEntity> { ... }

现在你可以像这样消费它:

var a = new Rep<MyEntity>(); 
var b = a.Get(x => x.Name); // string
var c = a.Get(x => x.Price); // decimal

这就是Linq的表现。 :)

答案 1 :(得分:1)

public IEnumerable<TEntity> Get<TEntity, TOrderBy>(Expression<Func<TEntity,TOrderBy>> orderBy)