实体框架 - 加入列表

时间:2011-11-08 16:09:33

标签: c# entity-framework entity-framework-4.1

我需要从我的数据库中检索一个实体列表,该列表与普通列表(不是EF)中的项目列表相匹配。这是否可以使用Entity Framework 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;

我知道这是无效的,因为它会说它需要是一个原始类型,但是有什么方法可以做我想要完成的事情,还是我需要求助于存储过程?

3 个答案:

答案 0 :(得分:0)

您需要将其细分为子属性。例如,类似的东西(这可能不会编译,我现在无法测试,但它应该给你一些工作):

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; 

答案 1 :(得分:0)

您有几个选择:

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;

<击>

只要表格不是很大,我就会选择第二个选项。否则,请先使用第一个。

答案 2 :(得分:0)

您必须考虑生成的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);