EF按复合键数组查找

时间:2017-12-21 09:56:35

标签: c# entity-framework

使用EF6我可以使用Find(key1.a, key1.b)方法通过复合主键获取实体。

是否可以对多个键执行相同操作,即

var keys = new [] {new {a = 1, b = 2}, new {a = 2, b = 3}, /*etc*/};
var entities = context.Items.Find(key1.a, key1.b, key2.a, key2.b, ..., keyN.a, keyN.b);

UPD

此外,我想知道为什么EF有两种按密钥搜索的方法:Find和LINQ的WhereSingle等。

2 个答案:

答案 0 :(得分:1)

documentation在这里很清楚:这是不可能的

  1. 它只返回一个实体
  2. 如果存在具有给定主键的多个实体,它实际上会抛出异常,如果您可以传递多个PK值,则很容易出现这种情况
  3. 最好的做法是使用LINQ' Where

    context.Items.Where(x => keys.Any(y => y.a == x.a && y.b == x.b))
    

答案 1 :(得分:1)

如果你可以为一个人做任何事情,你可以通过重复多次这样做来为许多人做。

您可以为此

编写扩展方法
public static class IDbSetExtensions
{
    public static ICollection<T> FindMany( this IDbSet<T> @this, IEnumerable<object[]> keys )
    {
        return keys.Select( key => @this.Find( key ) ).ToList();
    }
}