【发布时间】:2014-08-26 14:38:39
【问题描述】:
我在 SO 中查看了许多通用 linq 过滤问题及其答案,但没有一个能满足我的需求,所以我认为我应该创建一个问题。
我创建了许多我称之为“过滤器提供程序”的类,为我的模型中的每个实体类创建一个,以便为我的应用程序提供简单的搜索。我不想进入像 Lucene.Net 这样更高级的解决方案,因为具有匹配分数的基本过滤就足够了。
在这些提供程序类中的每一个中,都有多个方法将接收过滤条件并查询特定属性,并根据属性的相关性为每个匹配项返回一个分数。大多数方法会一次过滤多个属性,但不是全部。
这里有两种方法:
private IQueryable<Retailer> MatchHighRelevanceFields(string searchTerm, IQueryable<Retailer> retailers)
{
var results = retailers.Where(r =>
(r.CompanyName != null && r.CompanyName.ToUpper().Contains(searchTerm))
|| (r.TradingName != null && r.TradingName.ToUpper().Contains(searchTerm))
);
return results;
}
private IQueryable<Retailer> MatchMediumRelevanceFields(string searchTerm, IQueryable<Retailer> retailers)
{
var results = retailers.Where(r =>
(r.Address.Street != null && r.Address.Street.ToUpper().Contains(searchTerm))
|| (r.Address.Complement != null && r.Address.Complement.ToUpper().Contains(searchTerm))
);
return results;
}
这些方法在每个提供程序类中都被复制得令人作呕,我希望我可以将它们替换为一个可以接收要包含在查询中的属性的方法。
类似:
public static IQueryable<T> Match<T>(string searchTerm, IQueryable<T> data, Expression<Func<T, string>> filterProperties)
{
var results = **build the query for each property in filterProperties**
return results;
}
但我真的想不通。我尝试使用反射,但它只适用于 Linq to Objects,我需要 Linq to Entities 的解决方案。
【问题讨论】:
标签: c# entity-framework generics linq-to-entities