使用包含的EF查询记录时出现多个运行时错误

时间:2014-12-01 17:40:40

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

我正在编写一个使用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();

1 个答案:

答案 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。你直觉地想到了什么。

原因是整个表达式(entitiesToUpdateExpression)被翻译成SQL而EF根本无法将List个(类)对象转换为SQL(试着想象它在SQL中应该是什么样子:/)。

所以你做了正确的事,尽管

var idsToUpdate = entitiesToUpdate.Select(s => s.SomePropertyId).ToList();

有点短。