我有一个带有通用方法的存储库
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
任何猜测?
答案 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
来调用此方法,则预计predicate
为Func<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扩展方法的谓词参数)
如
在这有用吗?