【发布时间】:2018-07-23 15:22:53
【问题描述】:
我目前有一个数据对象,为了论证,我将其称为 foo...
public class Foo
{
public int IndexedKey { get; set;}
public string NonIndexedData {get; set;}
}
我有一个通用存储库,我想用它来查询这个对象,但是由于对数据库的权限,我不允许进行全表扫描。因此,我的任务是创建安全的查询对象。
public class FooQuery
{
public int IndexedKey
}
通用存储库允许任意谓词,它目前具有类似于以下的实现...
public class FooRepo : IGenericRepo<Foo>
{
private ICollection<Foo> _allFooRecords; //Imagine this is populated
public ICollection<Foo> GetWhere(Expression<Func<Foo, bool>> criteria)
{
return _allFooRecords.Where(criteria.Compile())
}
}
我希望能够做到以下...
public class FooRepo : IGenericRepo<Foo, FooQuery>
{
private ICollection<Foo> _allFooRecords; //Imagine this is populated
public ICollection<Foo> GetWhere(Expression<Func<FooQuery, bool>> criteria)
{
return _allFooRecords.Where(criteria.Compile())
}
}
以上内容无法编译。我知道 FooQuery 的属性肯定包含与 Foo 类的索引属性匹配的正确字段,但我不能再使用条件。编译因为它将返回一个与搜索 Foo 集合不兼容的函数。有没有办法使用上述签名进行这项工作,以及我需要对我的实现进行哪些更改才能使其正常工作。
非常感谢
【问题讨论】:
-
看我的回答,如果有问题请告诉我,否则请标记为已解决
-
哎呀,我知道您想做什么:FooQuery 实际上是您的视图模型,而 Foo 是您的真实实体,但您想通过基于您的视图模型的表达式查询 DB。所以你想要一个将你的视图模型映射到真实模型的解决方案,是吗?
-
尝试返回 IQueryable 而不是 ICollection。不会解决您的问题,但可能有助于大大提高性能并且可能是问题的一部分。
标签: c# linq generics lambda expression