无法将匿名类型从“System.Linq.IQueryable”转换为“System.Data.Entity.Core.

本文关键字:System 转换 Data Core Entity IQueryable Linq 类型 | 更新日期: 2023-09-27 18:35:53

以下查询在 EF5 中运行良好,但在使用 EF6 时出错。我使用 DbContext 和 CodeFirst。

使用 EF6 引发的错误:

无法强制转换类型"系统"。 Linq.IQueryable 1[[<>f__AnonymousType5 4[[System.Int32, mscorlib, version=4.0.0.0, culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Int32, mscorlib, Version=4.0.0.0, culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Int32, mscorlib, version=4.0.0.0, culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Int32, mscorlib, version=4.0.0.0, culture=neutral,

PublicKeyToken=b77a5c561934e089]], wms.Domain, version=1.0.0.0, culture=neutral, PublicKeyToken=85d69d39f5becc93]]' 键入"System."。 Data.Entity.Core.Objects.ObjectQuery 1[[<>f__AnonymousType5 4[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]],Wms.Domain, Version=1.0.0.0, Culture=neutral, PublicKeyToken=85d69d39f5becc93]]'.LINQ to 实体仅支持强制转换 EDM 基元或枚举类型。

查询(简体):

var unitsPerPosition = context.Positions.Include(p => p.Unit).Select(x => new { Unit = x.Unit, Position = x });
var orders = (
                from order in context.Orders.Include(x => x.SourceLocation);
                join unitPosition in unitsPerPosition on order.UnitId equals unitPosition.Unit.UnitId
                group new { order, unitPosition } by new { LocationId = order.SourceLocationId, Level = unitPosition.Position.Level } into groupOrders
                where groupOrders.Key.LocationId != null
                select new { 
                    LocationId = groupOrders.Key.LocationId.Value, 
                    Level = groupOrders.Key.Level, 
                    LoadingOrders = groupOrders.Count(), 
                    UnloadingOrders = -1 }
            );
IList<LocationChannels> searchResult = (from s in context.Locations
        .Include(s => s.Positions)
        .Include(s => s.Positions.Select(sp => sp.Unit))
        let channels = from p in s.Positions
                        where p.LocationId == s.LocationId
                        group p by new { p.LocationId, p.Column, p.Level } into channelsGroup
                        join order in orders on new { channelsGroup.Key.LocationId, channelsGroup.Key.Level } 
                        equals new { order.LocationId, order.Level } into ordersGroup
                        from o in ordersGroup.DefaultIfEmpty()
                        select new Channel
                        {
                            LocationId = channelsGroup.Key.LocationId,
                            Column = channelsGroup.Key.Column,
                            Level = channelsGroup.Key.Level
                        }
        select new LocationChannels
                      {
                        Location = s,
                        Channels = channels,
                      })
    .Where(predicate).ToList();

问题似乎在左侧连接,在变量"orders"中加载了匿名类型。我还尝试将 ToList() 添加到"订单"查询中,但随后错误更改为:

无法创建类型为"匿名类型"的常量值。在此上下文中仅支持基元类型或枚举类型。

有人可以给我一个关于如何解决它的提示吗?

更新:该错误已在 EF 6.0.2 中确认并解决。请参阅代码复合上的问题。

无法将匿名类型从“System.Linq.IQueryable”转换为“System.Data.Entity.Core.

正如 dna2 在他的问题末尾所指出的那样,这个问题在 EF 6.0.2 中得到了修复。若要升级 EF 版本,请在程序包管理器控制台 (VS2013 VIEW -> Other Windows -> Package Manager Console) 中执行以下操作。

Update-Package EntityFramework -Version 6.0.2 
相关文章: