Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
c#Lambda查询上的多个独立过滤器_C#_Entity Framework_Linq_Lambda - Fatal编程技术网

c#Lambda查询上的多个独立过滤器

c#Lambda查询上的多个独立过滤器,c#,entity-framework,linq,lambda,C#,Entity Framework,Linq,Lambda,今天我已经为此工作了好几个小时,感觉有一种简单的方法可以做到这一点,但除了暴力,我无法让它工作 我的应用程序中有一个实体,它作为两个对象之间的映射,基于5个过滤器。目标是找到与过滤器最匹配的记录 现在,我手动强制执行2^5个查询来获取最具体的行,但感觉必须有一种更简单的方法来实现这一点 这里唯一的问题是数据库中可能没有与特定筛选器(或所有筛选器)匹配的内容,在这种情况下,我希望选择空记录 下面是我尴尬的暴力查询的一个摘录——我首先想尝试匹配所有5个过滤器,然后是4个匹配的排列,然后是3个、2个、

今天我已经为此工作了好几个小时,感觉有一种简单的方法可以做到这一点,但除了暴力,我无法让它工作

我的应用程序中有一个实体,它作为两个对象之间的映射,基于5个过滤器。目标是找到与过滤器最匹配的记录

现在,我手动强制执行2^5个查询来获取最具体的行,但感觉必须有一种更简单的方法来实现这一点

这里唯一的问题是数据库中可能没有与特定筛选器(或所有筛选器)匹配的内容,在这种情况下,我希望选择空记录

下面是我尴尬的暴力查询的一个摘录——我首先想尝试匹配所有5个过滤器,然后是4个匹配的排列,然后是3个、2个、1个,最后是所有空值

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;
你能详细说明一下“但那不起作用”吗?此外,使用两个或三个过滤器(而不是五个过滤器)阅读示例会容易得多。