我正在编写一个使用EF-5的更新方法,并且在选择记录以进行目标更新时遇到了问题。
public void Update(List<MyEntities> entitiesToUpdate)
{
// Get rows that match IDs
var findUpdateRows = this
._context
.MyEntity
.Where(w => entitiesToUpdate
.Select(s => s.SomePropertyId)
.ToList()
.Contains(w.SomePropertyId)
)
.ToList();
}
// run time error - LINQ to Entities does not recognize the method 'System.Collections.Generic.List`1[System.Int32] ToList[Int32](System.Collections.Generic.IEnumerable`1[System.Int32])' method, and this method cannot be translated into a store expression.
如果我改为尝试:
// Get rows that match IDs
var findUpdateRows = this
._context
.MyEntity
.Where(w => entitiesToUpdate
.Select(s => s.SomePropertyId)
.Contains(w.SomePropertyId)
)
.ToList();
// Run time error - Unable to create a constant value of type 'xxx.MyEntities'. Only primitive types or enumeration types are supported in this context.
我可以使用下面的方法使方法按预期工作(但我想知道并了解如何在不使用单独的idsToUpdate var和赋值的情况下完成相同的操作):
// Create list of IDs to update
List<int> idsToUpdate = new List<int>();
entitiesToUpdate.ForEach(fe => idsToUpdate.Add(fe.SomePropertyId));
// Get rows that match IDs
var findUpdateRows = this
._context
.MyEntity
.Where(w => idsToUpdate.Contains(w.SomePropertyId))
.ToList();
答案 0 :(得分:1)
此例外
无法创建类型的常量值...
始终指示在LINQ语句对象(类实例)中的某处使用,其中EF只能处理原始值。所以第一步是看:我在哪里使用对象?
var findUpdateRows = this._context.MyEntity // here
.Where(w => entitiesToUpdate // here
.Select(s => s.SomePropertyId)
.Contains(w.SomePropertyId))
现在我们知道只有this._context.MyEntity
行会运行,所以它应该是entitiesToUpdate
。你直觉地想到了什么。
原因是整个表达式(entitiesToUpdate
是Expression
)被翻译成SQL而EF根本无法将List
个(类)对象转换为SQL(试着想象它在SQL中应该是什么样子:/)。
所以你做了正确的事,尽管
var idsToUpdate = entitiesToUpdate.Select(s => s.SomePropertyId).ToList();
有点短。