我有一个包含两列的表格,可用作过滤条件。使用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"
}
};
}
答案 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个查询运行(未测试)