我已经在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;
}
Run Code Online (Sandbox Code Playgroud)
这些方法在每个提供程序类中都被复制,我希望我可以将它们替换为接收要包含在查询中的属性的单个方法.
就像是:
public static IQueryable<T> Match<T>(string searchTerm, IQueryable<T> data, Expression<Func<T, string>> filterProperties)
{
var results = **build the query for each property …Run Code Online (Sandbox Code Playgroud)