实体框架-连接到列表
本文关键字:列表 连接 框架 实体 | 更新日期: 2023-09-27 18:13:55
我需要从数据库中检索与普通列表(非EF)中的项目列表匹配的实体列表。这是可能的实体框架4.1?
的例子:
var list = new List<string> { "abc", "def", "ghi" };
var items = from i in context.Items
where list.Contains(i.Name)
select i;
返回匹配一个属性的行效果很好,但我实际上有一个更复杂的属性:
var list = new List<Tuple<string, string>>
{
new Tuple<string,string>("abc", "123"),
new Tuple<string,string>("def", "456")
};
// i need to write a query something like this:
var items = from i in context.Items
where list.Contains(new Tuple<string,string>(i.Name, i.Type))
select i;
我知道这是无效的,因为它会说它需要是一个基本类型,但是有什么方法可以做到我想要完成的,或者我需要求助于存储过程吗?
您有几个选择:
1)当然,您可以编写一个存储过程来做您需要做的事情并调用它。
2)你可以把表读入内存,然后查询内存列表…这样你就不必使用原语了:
var items = from i in context.Items.ToList()
where list.Contains(new Tuple<string, string>(i.Name, i.Type))
select i;
<罢工>3)你也可以将你的查询转换为使用原语来实现相同的目标:罢工>
var items = from i in context.Items
join l in list
on new { i.Name, i.Type } equals
new { Name = l.Item1, Type = l.Item2 }
select i;
我会选择第二个选项,只要表不是特别大。否则,使用第一个
您需要将其分解为子属性。例如,类似于(这可能无法编译,我目前无法测试,但它应该给你一些工作):
var items = from i in context.Items
where list.Select(x => x.Item1).Contains(i.Name)
&& list.Select(x => x.Item2).Contains(i.Type)
select i;
您必须考虑生成的SQL将是什么样子,这将很难直接在SQL中完成。
我的建议是你把元组的一个字段拆分出来,然后用它来减少结果列表,得到查询结果,然后再次过滤以匹配其中一个元组,例如
var list = new List<string> { "abc", "def" };
var list2 = new List<Tuple<string, string>>
{
new Tuple<string,string>("abc", "123"),
new Tuple<string,string>("def", "456")
};
var items = (from i in context.Items
where list.Contains(i.Name)
select i)
.AsEnumerable()
.Where(i => list2.Any(j => j.val1 == i.Name && j.val2 == i.Type);