2016-04-04 30 views
3

让我们假设我有一个包含3个属性的元组列表。现在在我的数据库中,我有一个表有3个字段可能与元组匹配或不匹配。如何在地球上我告诉EFC#,EF:使用元组列表从表中选择

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

我很明白如何做到这一点,如果我有一个元组,但我不知道如何做,当我有一个元组列表,并且我希望返回来自OtherTable的所有匹配记录。如果我在单个属性上匹配,我会做类似“where ListOfIds.Contains(id)...”的内容,然后去我的一天,但有多个属性,这种方法分崩离析。

任何帮助极大地赞赏。

+0

您的元组列表中有多少项?如果它不是很多,那么你就可以随时产生一个长时间的“OR”查询 - 如果是很多,我会把它们放到一个临时的。表并使用'IN'查询 – Carsten

+0

@Carsten在我的列表中可能有数百个元组。我仍在环顾四周。看起来我将不得不使用某种类型的SProc。 –

+0

数以百计并没有那么多 - 说实话我会尝试使用一个大的or-ed在哪里 - 如果这不起作用或者要慢慢尝试第二个 – Carsten

回答

1

什么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();