通用LINQ Select实现

时间:2012-07-13 04:01:01

标签: linq entity-framework entity-framework-4 repository

我正在尝试实现一个泛型选择,我在我的Repository实现中使用了以下结构

 public IEnumerable<TEntity> Populate(Expression<Func<TEntity,bool>> predicate)
    {
        return (IEnumerable<TEntity>) _objectSet.Select(predicate).AsEnumerable();
    }

这是我用

的业务逻辑调用的
public IEnumerable<DTO.Category> Populatelist()
    {

        return _repository.Populate(predicate: category => new { category.CategoryID, category.CategoryName }).ToList();

    }

但是应该作为BTO.Category对象的类别的行为与 CategoryID CategoryName 的行为不同,它显示无法解析符号< /强>

我正在做正确的事还是错过了什么?

2 个答案:

答案 0 :(得分:1)

很好找到解决方案......签名应该是

List<TResult> Populate<TResult>(Expression<Func<TEntity, TResult>> predicate);

存储库类中的实现

public List<TResult> Populate<TResult>(Expression<Func<TEntity, TResult>> source)
{
        return _objectSet.Select(source).ToList();
}

现在使用Business Logic For Eg -

public IDictionary<int,string> Populatelist( )
{

    var expectedResult =_repository.Populate(category => new {category.CategoryID, category.CategoryName}).ToList();

    return expectedResult.ToDictionary(c => c.CategoryID, c => c.CategoryName);

}

问题是因为返回类型是匿名的,因此在传递值时会产生问题,现在返回类型是列表类型的Tresult,因此没有转换错误..

答案 1 :(得分:-1)

您需要定义要在泛型方法中使用的泛型参数:

public IEnumerable<TEntity> Populate<TEntity>(Expression<Func<TEntity, bool>> predicate)

然后,使用它如下:

return _repository.Populate<DTO.Catrgory>(predicate: category => new { category.CategoryID, category.CategoryName }).ToList();