使用Linq to Entities查找表中的最佳匹配

时间:2010-11-02 21:43:30

标签: c# entity-framework linq-to-entities

我有一个包含两列的表格,可用作过滤条件。使用Linq to Entities,我想传入两个值并始终返回最接近的匹配。例如,(1,2)应该返回(1,2)而不是(null,2)作为最接近的。如果两个值都没有找到匹配项,则使用Null,Null列匹配。

以下是示例代码。

如果在第一个Data中传递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"
                                           }
                                   };


        }

1 个答案:

答案 0 :(得分:1)

可以简单地执行类似

的操作
    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个查询运行(未测试)