什么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();
您的元组列表中有多少项?如果它不是很多,那么你就可以随时产生一个长时间的“OR”查询 - 如果是很多,我会把它们放到一个临时的。表并使用'IN'查询 – Carsten
@Carsten在我的列表中可能有数百个元组。我仍在环顾四周。看起来我将不得不使用某种类型的SProc。 –
数以百计并没有那么多 - 说实话我会尝试使用一个大的or-ed在哪里 - 如果这不起作用或者要慢慢尝试第二个 – Carsten