0

我有一个带有通用方法的存储库

 public IQueryable<TEntity> Populate<TEntity1>(Func<TEntity, TEntity1> predicate)
    {
        return (IQueryable<TEntity>)_objectSet.Select(predicate);
    }

和一个调用这个方法的类

 public IDictionary<int,string> Populatelist()
    {
        var dic =_repository.Populate<DTO.Category>(category => new { category.CategoryID, category.CategoryName }).ToList();

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

    }

但我不知道它为什么显示

无法将表达式类型谓词:category => new { category.CategoryID, category.CategoryName } 转换为返回类型 DTO.Category

有什么猜测吗?

4

4 回答 4

1
    public IQueryable<TEntity1> Populate<TEntity>(Func<TEntity, TEntity1> predicate)
    {
        return (IQueryable<TEntity1>)_objectSet.Select(predicate);
    }

    public IDictionary<int, string> Populatelist()
    {
        var dic = _repository.Populate<DTO.Category>(category => new DTO.Category() { category.CategoryID, category.CategoryName }).ToList();

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

    }

我希望这将有所帮助。在 Lambda 表达式中使用 new DTO.Category() 而不是匿名类型。

于 2012-07-13T07:14:44.273 回答
1

采用

_repository.Populate(category => ...

代替

_repository.Populate<DTO.Category>(category => ...

的返回类型也Popualte应该是IQueryable<TEntity1>并且演员表应该被删除。


解释

以下方法

public IQueryable<TEntity> Populate<TEntity1>(Func<TEntity, TEntity1> predicate)

除了 aFunc<TEntity, TEntity1>作为参数。

所以如果你用DTO.Categoryas调用这个方法TEntity1,它predicate应该是一个Func<TEntity, DTO.Category>.

因此,您调用.Populate<DTO.Category>,但您的参数不是Func<TEntity, DTO.Category>,而是category => new { category.CategoryID, category.CategoryName },返回新匿名类型的表达式。

因此,错误消息很清楚地说它无法转换您的表达式,因为它需要一个返回 a 的函数DTO.Category


结论

我猜DTO.Category只是TEntity你的_repository

所以你只想省略类型参数。

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

所以类型参数Populate<TEntity1>将由编译器推断:它将是您使用表达式创建的异常类型。

于 2012-07-13T07:43:23.187 回答
0

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

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

Repository 类中的实现

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

现在从业务逻辑中使用它,例如-

    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);

    }

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

于 2012-07-15T05:17:15.800 回答
-2

您的方法的返回类型是 IQueryable,但您的方法返回的是匿名类型
new { category.CategoryID, category.CategoryName },它不能转换为 TEntity。

另外,我认为使用
return _objectSet.Select(predicate).AsQueryable();更安全

顺便说一句,谓词对于您的参数来说不是一个好名字,因为谓词意味着一个 lambda,它通过返回一个标记项目是否通过测试的布尔值来区分项目(例如 Where 扩展方法的谓词参数)

这有帮助吗?

于 2012-07-13T07:21:54.500 回答