假设我有这种方法:
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()实现。查找(pKeys)。然而,这使得dbq.Include(property)
或mContext.Entry(wanted).Collection(property).Load()
对于parent.child属性的使用变得复杂,这是与该问题无关的另一个问题。
答案 0 :(得分: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();
}