0

もう1つの結合で拡張する必要がある、かなり醜いクエリがあります。クエリのビルドでは、NullReferenceExceptionランタイムがスローされます。私は例外の詳細について苦労しているので、私はTargetSite/CustomAttributes/Message = "The method or operation is not implemented."にメッセージを見つけましたが、どの方法がわからないのですか?EF複数の列のLinq結合でNullReference例外がスローされる

MarkedItemsは新しい結合で、問題は複数の列の結合であるか、group by節に新しい表を追加する必要があると思います。 EF6でLinqPadで同じクエリが実行されるため、これはまだEF7で実装されていないものでなければなりません。

EFコアバージョンは1.1.2です。

クエリ:私は私のクエリで実際の問題を見つけることができたコメントへの

var inventory = (from it in _ctx.Items 
        join i in _ctx.Inventories on it.Id equals i.ItemId into iit 
        from i in iit.DefaultIfEmpty() 
        join m in _ctx.MarkedItems on 
         new { 
           eancode = i.EANCode, 
           projectid = i.ProjectId 
          } 
         equals new { 
          eancode = (m != null ? m.EANCode : string.Empty), 
          projectid = (m != null ? m.ProjectId : Guid.Empty) 
         } into im 
        from m in im.DefaultIfEmpty()      
        where it.ProjectId == cmp.ProjectId 
        group i by new { 
         EANCode = it.EANCode, 
         ItemNo = it.ItemNo, 
         Name = it.Name, 
         BaseQty = it.BaseQty, 
         Price = it.Price, 
         m = (m != null ? m.EANCode : null) 
        } into lg 
        select new ComparisonBaseModel() { 
          EANCode = lg.Key.EANCode, 
          ItemName = lg.Key.Name, 
          Price = lg.Key.Price, 
          ScanQty = lg.Sum(s => s != null ? s.ScanQty : 0), 
          BaseQty = lg.Key.BaseQty, 
          DiffQty = lg.Sum(s => s != null ? s.ScanQty : 0) - lg.Key.BaseQty, 
          DiffPrice = lg.Key.Price * (lg.Sum(s=> s!= null ? s.ScanQty : 0) - lg.Key.BaseQty), 
          AllTasked = !lg.Any(s=>(s != null && s.InventoryTaskId == null) || s==null), 
          Flagged = lg.Key.m != null 
        }).Where(x=>x.DiffQty != 0); 
+1

'i.EANCode'と' i.ProjectId'を 'i?.EANCode'と' i?.ProjectId'に置き換えてみてください。 – dasblinkenlight

+0

これは速く、ありがとう。私?型の不一致により働いたが、 'eancodeは=(I = nullのi.EANCode!?:String.Emptyを)していない、 PROJECTID =(I = nullのi.ProjectId:!?Guid.Empty)'行なったし、それが働いています! – Perrier

+0

私たちが比較できるように、** **仕事をしたクエリを含めてください。 – mjwills

答えて

0

感謝。インベントリ(i)もnullになる可能性があるので、MarketItemsのi-s(m-sだけでなく)でもnullをチェックしなければならなかった。これは誰もが、私はすでにいくつかのEF7/EF6の違いに実行した後にエラーメッセージが誤解を招くたに役立つことができれば

わかりません。

var inventory = (from it in _ctx.Items 
        join i in _ctx.Inventories on it.Id equals i.ItemId into iit 
        from i in iit.DefaultIfEmpty() 
        join m in _ctx.MarkedItems on 
         new { 
           eancode = (i != null ? i.EANCode : string.Empty), 
           projectid = (i != null ? i.ProjectId : Guid.Empty) 
          } 
         equals new { 
          eancode = (m != null ? m.EANCode : string.Empty), 
          projectid = (m != null ? m.ProjectId : Guid.Empty) 
         } into im 
        from m in im.DefaultIfEmpty()      
        where it.ProjectId == cmp.ProjectId 
        group i by new { 
         EANCode = it.EANCode, 
         ItemNo = it.ItemNo, 
         Name = it.Name, 
         BaseQty = it.BaseQty, 
         Price = it.Price, 
         m = (m != null ? m.EANCode : null) 
        } into lg 
        select new ComparisonBaseModel() { 
          EANCode = lg.Key.EANCode, 
          ItemName = lg.Key.Name, 
          Price = lg.Key.Price, 
          ScanQty = lg.Sum(s => s != null ? s.ScanQty : 0), 
          BaseQty = lg.Key.BaseQty, 
          DiffQty = lg.Sum(s => s != null ? s.ScanQty : 0) - lg.Key.BaseQty, 
          DiffPrice = lg.Key.Price * (lg.Sum(s=> s!= null ? s.ScanQty : 0) - lg.Key.BaseQty), 
          AllTasked = !lg.Any(s=>(s != null && s.InventoryTaskId == null) || s==null), 
          Flagged = lg.Key.m != null 
        }).Where(x=>x.DiffQty != 0); 
関連する問題