无法将表达式类型谓词转换为返回类型

时间:2012-07-13 06:55:10

标签: c# linq entity-framework-4 lambda

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

 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 =&gt; new {category.CategoryID,category.CategoryName}返回类型DTO.Category

任何猜测?

4 个答案:

答案 0 :(得分: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);

    }

我希望这会有所帮助。在Lambdaexpression中使用新的DTO.Category()而不是匿名类型。

答案 1 :(得分:1)

使用

_repository.Populate(category => ...

而不是

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

Popualte的返回类型也应该是IQueryable<TEntity1>,并且应该移除广告。


<强>解释

以下方法

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

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

因此,如果您使用DTO.Category作为TEntity1来调用此方法,则预计predicateFunc<TEntity, DTO.Category>

所以你打电话给.Populate<DTO.Category>,但你的论点不是Func<TEntity, DTO.Category>,而是category => new { category.CategoryID, category.CategoryName },这是一个返回新匿名类型的表达式。

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


<强>结论

我猜DTO.Category只是TEntity的{​​{1}}。

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

_repository

因此编译器会输入var dic =_repository.Populate(category => new { category.CategoryID, category.CategoryName }).ToList(); 的类型参数:它将是您使用表达式创建的不同类型。

答案 2 :(得分:0)

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

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,因此没有转换错误..

答案 3 :(得分:-2)

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

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

btw,谓词不是你的参数的一个好名字,因为谓词是指一个lambda,通过返回一个bool来区分项目,该bool标记项目是否通过了测试(例如Where扩展方法的谓词参数)

在这有用吗?