4

次のクエリは EF5 ではうまく機能していましたが、EF6 ではエラーが発生します。私は DbContext と CodeFirst を使用しています。

EF6 で発生したエラー:

型 'System.Linq.IQueryable 1[[<>f__AnonymousType54[[System.Int32, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089],[System.Int32, mscorlib, Version=4.0.0.0, Culture=]をキャストできませんニュートラル、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.ObjectQuery1[[<>f__AnonymousType54[[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、バージョン = 4.0.0.0、カルチャ = ニュートラル、PublicKeyToken = b77a5c561934e089]、[System.Int32、mscorlib、バージョン = 4.0.0.0、カルチャ = ニュートラル、PublicKeyToken = b77a5c561934e089]]、Wms.Domain、バージョン = 1.0.0.0 、カルチャ = ニュートラル、PublicKeyToken = 85d69d39f5becc93]]'. LINQ to Entities は、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 で解決されました。CodePlex の問題を参照してください。

4

1 に答える 1

1

質問の最後に dna2 が指摘したように、この問題は で修正されましたEF 6.0.2。EF のバージョンをアップグレードするには、パッケージ マネージャー コンソール (VS2013 VIEW -> Other Windows -> Package Manager Console) で次の操作を行います。

Update-Package EntityFramework -Version 6.0.2 
于 2015-05-21T15:20:31.593 に答える