C#,EF:使用元组列表

时间:2016-04-04 04:27:19

标签: c# entity-framework list

假设我有一个包含3个属性的元组列表。现在在我的数据库中,我有一个表有3个字段,可能与元组匹配也可能不匹配。我怎么告诉EF

“从OtherTable o中选择o.Prop1 = tuple.Item1&& o.Prop2 = tuple.Item2&& o.Prop3 = tuple.Item3”。

如果我有一个元组,我很清楚如何做到这一点,但是当我有一个元组列表并且我想要返回OtherTable的所有匹配记录时,我不知道该怎么做。如果我在一个属性上进行匹配,我会做一些像“ListOfIds.Contains(id)...”这样的事情,然后继续我的一天,但是有了多个属性,这种方法就会崩溃。

非常感谢任何帮助。

1 个答案:

答案 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();