假设我有一个包含3个属性的元组列表。现在在我的数据库中,我有一个表有3个字段,可能与元组匹配也可能不匹配。我怎么告诉EF
“从OtherTable o中选择o.Prop1 = tuple.Item1&& o.Prop2 = tuple.Item2&& o.Prop3 = tuple.Item3”。
如果我有一个元组,我很清楚如何做到这一点,但是当我有一个元组列表并且我想要返回OtherTable的所有匹配记录时,我不知道该怎么做。如果我在一个属性上进行匹配,我会做一些像“ListOfIds.Contains(id)...”这样的事情,然后继续我的一天,但是有了多个属性,这种方法就会崩溃。
非常感谢任何帮助。
答案 0 :(得分:1)
对于具有动态“where”条件的实体的SQL查询怎么样?
var list = new List<Tuple<string, int, bool>>();
list.Add(new Tuple<string, int, bool>("1", 2, true));
list.Add(new Tuple<string, int, bool>("2", 4, true));
list.Add(new Tuple<string, int, bool>("3", 5, false));
var query = list.Select(x => x.GetType().GetProperties().Select((y, index) => string.Concat("o.Prop", index + 1, "=", y.GetValue(x))).Aggregate((a, b) => a + " and " + b))
.Aggregate((a, b) => string.Format("({0}) or ({1})", a, b));
var result = context.OtherTable.SqlQuery("Select * from OtherTable o where " + query).ToList();
或者您可以使用Contains
那种方式(如 wonderbell 所说,只有当你的所有o.Prop N 都有字符串类型时它才会起作用,但是您可以尝试使用类似SqlFunctions.StringConvert
的内容将其他类型转换为字符串):
var queryList = list.Select(x => x.GetType().GetProperties().ToList().OrderBy(x => x.Name).Select(y => y.GetValue(x).ToString())
.Aggregate((a, b) => a + "," + b));
var result = context.OtherTable.Where(x => queryList.Contains(x.Prop1 + "," + x.Prop2 + "," + x.Prop3))
.ToList();