我想使用通用存储库来标准化我的一些数据访问。 我想要的是能够在界面中定义一个代表我的实体的基本字段的函数,以便我可以使用它来过滤结果。这应该可以编译成Linq-To-Sql。
e.g。
interface IEntity {
Expression<func<bool>> FilterQuery(string filter)
}
partial class AnEntity : IEntity
{
public string AName {get; set;}
Expression<func<bool>> FilterQuery(string filter)
{
return AName.Contains(filter);
}
}
class List<T> : where T : class, IEntity
{
private IQueryable<T> items;
public IQueryable<T> show(string filter)
{
items = items.Where(AN => AN.FilterQuery(filter));
return items;
}
}
但是,我通常会遇到如下错误:
无法将lambda表达式转换为 代表类型 '
System.Func<T,int,bool>
'因为 块中的一些返回类型 不能隐含地转换为 委托返回类型
实现我的目标的最佳方法是什么,在可以在linq到sql where子句中使用的实体上定义泛型?
答案 0 :(得分:1)
Where
的lambda需要采用实体类型;我希望你需要:
interface IEntity<T> where T : class {
Expression<Func<T, bool>> FilterQuery(string filter);
}
partial class AnEntity : IEntity<AnEntity>
{
public string AName {get; set;}
Expression<Func<AnEntity,bool>> IEntity<AnEntity>.FilterQuery(string filter)
{
return x => x.AName.Contains(filter);
}
}
然而; FilterQuery
方法不像实体责任......(关注点分离);这就是为什么它在“列表”案例中没有帮助;也许你需要把它移到列表中?但是当它起作用时,就像:
T template = new T(); // this is a horrible way to get the filter!!!
// and illustrates that this method doesn't belong on
// this type; only done this way to fit the question's
// pretext - which I believe is... suboptimal.
var filterQuery = template.FilterQuery(filter);
items = items.Where(filterQuery);