c#Lambda查询上的多个独立过滤器
今天我已经为此工作了好几个小时,感觉有一种简单的方法可以做到这一点,但除了暴力,我无法让它工作 我的应用程序中有一个实体,它作为两个对象之间的映射,基于5个过滤器。目标是找到与过滤器最匹配的记录 现在,我手动强制执行2^5个查询来获取最具体的行,但感觉必须有一种更简单的方法来实现这一点 这里唯一的问题是数据库中可能没有与特定筛选器(或所有筛选器)匹配的内容,在这种情况下,我希望选择空记录 下面是我尴尬的暴力查询的一个摘录——我首先想尝试匹配所有5个过滤器,然后是4个匹配的排列,然后是3个、2个、1个,最后是所有空值c#Lambda查询上的多个独立过滤器,c#,entity-framework,linq,lambda,C#,Entity Framework,Linq,Lambda,今天我已经为此工作了好几个小时,感觉有一种简单的方法可以做到这一点,但除了暴力,我无法让它工作 我的应用程序中有一个实体,它作为两个对象之间的映射,基于5个过滤器。目标是找到与过滤器最匹配的记录 现在,我手动强制执行2^5个查询来获取最具体的行,但感觉必须有一种更简单的方法来实现这一点 这里唯一的问题是数据库中可能没有与特定筛选器(或所有筛选器)匹配的内容,在这种情况下,我希望选择空记录 下面是我尴尬的暴力查询的一个摘录——我首先想尝试匹配所有5个过滤器,然后是4个匹配的排列,然后是3个、2个、
incList.FirstOrDefault(x =>
x.Filter1 == filter1Parameter && x.Filter2 == filter2Parameter && x.Filter3 == filter3Parameter && x.Filter4 == filter4Parameter && x.Filter5 == filter5Parameter
|| x.Filter1 == null && x.Filter2 == filter2Parameter && x.Filter3 == filter3Parameter && x.Filter4 == filter4Parameter && x.Filter5 == filter5Parameter
|| x.Filter1 == filter1Parameter && x.Filter2 == null && x.Filter3 == filter3Parameter && x.Filter4 == filter4Parameter && x.Filter5 == filter5Parameter
|| x.Filter1 == filter1Parameter && x.Filter2 == filter2Parameter && x.Filter3 == null && x.Filter4 == filter4Parameter && x.Filter5 == filter5Parameter
|| x.Filter1 == filter1Parameter && x.Filter2 == filter2Parameter && x.Filter3 == filter3Parameter && x.Filter4 == null && x.Filter5 == filter5Parameter
|| x.Filter1 == filter1Parameter && x.Filter2 == filter2Parameter && x.Filter3 == filter3Parameter && x.Filter4 == filter4Parameter && x.Filter5 == null
我最初认为我可以有一个简单的语句,如果存在,它可以独立地获取值,如果不存在,它可以获取null
incList.FirstOrDefault(x => (x.Filter1 == filter1Parameter || x.Filter1 == null) &&
(x.Filter2 == filter2Parameter || x.Filter2 == null) &&
(x.Filter3 == filter3Parameter || x.Filter3 == null) &&
(x.Filter4 == filter4Parameter || x.Filter4 == null) &&
(x.Filter5 == filter5Parameter || x.Filter5 == null));
但这并不奏效
任何提示都将不胜感激。我仍在努力理解需求的全部内容 但是,您是否已探索过在单独的类中抽象此Func或Func。这一个或多个单独的类将像策略一样运行。仅负责根据特定谓词筛选集合的内容
如果这似乎不是一条好的途径,那么考虑编写自己的实现IEqualityComparer怎么样。这将允许您确定是什么使这些对象相等。您可以引入类似“适应度函数”的功能,然后选择具有最大适应度值的项目
var bestMatch = incList.Select(x => new
{
item = x,
fit =
(x.Filter1 == null
? 1
: (x.Filter1 == filter1Parameter ? 2 : 0)) *
(x.Filter2 == null
? 1
: (x.Filter2 == filter2Parameter ? 2 : 0)) // and so on
})
.OrderByDescending(x => x.fit)
.FirstOrDefault(x => x.fit > 0)?.item;
你能详细说明一下“但那不起作用”吗?此外,使用两个或三个过滤器(而不是五个过滤器)阅读示例会容易得多。