C# 使用Linq to实体查找表中的最佳匹配

C# 使用Linq to实体查找表中的最佳匹配,c#,entity-framework,linq-to-entities,C#,Entity Framework,Linq To Entities,我有一个包含两列的表,将用作筛选条件。使用Linq to实体,我希望传入两个值并始终返回最接近的匹配。例如,(1,2)应该返回(1,2)not(null,2)作为最近的。如果两个值均未找到匹配项,则使用Null、Null列匹配项 下面是示例代码 如果传入3,3,则应返回第一个数据(null,null),因为没有匹配项 如果传入1,3,则应返回第二个数据(1,null) 如果传入3,2,则应返回第三个数据(null,2) 如果传入1,2,则应返回第四个数据(1,2) 这是否可能在一个Linq查询中

我有一个包含两列的表,将用作筛选条件。使用Linq to实体,我希望传入两个值并始终返回最接近的匹配。例如,(1,2)应该返回(1,2)not(null,2)作为最近的。如果两个值均未找到匹配项,则使用Null、Null列匹配项

下面是示例代码

如果传入3,3,则应返回第一个数据(null,null),因为没有匹配项

如果传入1,3,则应返回第二个数据(1,null)

如果传入3,2,则应返回第三个数据(null,2)

如果传入1,2,则应返回第四个数据(1,2)

这是否可能在一个Linq查询中实现,因为它正在生成数据库命中

public class Data
        {
            public string prop1 { get; set; }
            public  string prop2 { get; set; }
        }

        static void Main(string[] args)
        {
            List<Data> datas = new List<Data>
                                   {
                                       new Data
                                           {
                                               prop1 = null,
                                               prop2 = null
                                           },
                                       new Data
                                           {
                                               prop1 = "1",
                                               prop2 = null
                                           },
                                       new Data
                                           {
                                               prop1 = null,
                                               prop2 = "2"
                                           },
                                       new Data
                                           {
                                               prop1 = "1",
                                               prop2 = "2"
                                           }
                                   };


        }
公共类数据
{
公共字符串prop1{get;set;}
公共字符串prop2{get;set;}
}
静态void Main(字符串[]参数)
{
列表数据=新列表
{
新数据
{
prop1=null,
prop2=null
},
新数据
{
prop1=“1”,
prop2=null
},
新数据
{
prop1=null,
prop2=“2”
},
新数据
{
prop1=“1”,
prop2=“2”
}
};
}

可以简单地执行以下操作

    Data def = new Data { prop1 = null, prop2 = null };
    var result = (from d in datas
                  where d.prop1 == value1 || d.prop2 == value2
                  orderby (d.prop1 == value1 ? 8 : 0) + (d.prop2 == value2 ? 4 : 0) + (d.prop1 == null ? 2: 0) + (d.prop2 == null ? 1 : 0) descending
                  select d).FirstOrDefault() ?? def;

其中value1和value2是要搜索的2字符串,应作为1查询运行(未测试)

这不包括prop1或prop2不匹配的情况,我想返回null,null条目。Hrm,只需将其添加为额外的null检查?将示例更改为显示,如果您希望它从集合中获取第一个值,只需删除完整的where行即可。如果列表中的数据顺序发生更改,这也不起作用:/例如,切换条目3和4将导致(3,2)返回(1,2)。但您并没有说希望在填充的值上使用空值