0

假设我有这个方法:

public T GetByID(object[] pKeys)
{
    DbQuery<T> dbq = mContext.GetDbSet<T>();
    return dbq.SingleOrDefault(ent => ent.PrimaryKey.SequenceEqual(pKeys));
}

ent.PrimaryKey是一个object[]

当然,这不起作用,因为SequenceEqual(). 我也许可以使用Contains,但这不会保留顺序:{1, 2} 不等于 {2, 1}。

我也可以AsEnumerable()先使用然后使用一些逻辑,但这会将整个表加载到内存中,这是不可接受的。

有没有办法做到这一点?

编辑

我已经使方法通用。因为这就是它的真正含义,并且主键是一个数组更有意义。

我还指出,这里方法的目标可以通过 mContext.GetDbSet().Find(pKeys) 来实现。然而,这使得使用dbq.Include(property)mContext.Entry(wanted).Collection(property).Load()用于 parent.child 属性变得复杂,这是与问题无关的另一件事。

4

1 回答 1

0

如果没有可重现的代码,测试任何特定的解决方案有点困难,但我想到的第一件事(并在记事本中编译/测试)是

public T GetByID(object[] pKeys)
{
    DbQuery<T> dbq = mContext.GetDbSet<T>();

    for (var i = 0; i < pKeys.length; i++)
    {
        dbq = dbq.Where(ent => ent.PrimaryKey[i] == pKeys[i]);
    }

    return dbq.SingleOrDefault();
}  
于 2013-09-20T13:56:33.237 回答