.NETコアで例外を引き起こすエンティティへのLINQ、 "値はnullにはできません"

c# entity-framework-core linq

質問

私は現在、EF6の企業フレームワークをEFコアと互換性のあるものに変換しようとしています。私は少しブロックに入った。 EF6でうまく動作するEF「ストアドプロシージャ」は、EFコアのこのコードブロックでは失敗しています。

var allFolderAncestors = (from f in context.MENU_MenuFolders
                          from mtf in context.MENU_MenuToolbar_MenuFolders
                                             .Where(x => x.MenuFolderId == f.Id 
                                                      || x.MenuFolderId == f.ParentFolderId)
                                             .DefaultIfEmpty()
                          where (toolbarId == -1 
                          || (mtf == null 
                                ? false 
                                : mtf.MenuToolbarId == toolbarId)
                          ) 
                          && f.Id != 0
                          select new
                          {
                              AncestorFolderId = f.Id,
                              AncestorParentFolderId = f.ParentFolderId,
                              Id = f.Id,
                              ParentFolderId = f.ParentFolderId
                          }).ToList();

このコード行を実行しようとすると、次の例外メッセージが表示されます。

Value cannot be null. Parameter name: left

入力パラメータがとき、私たちの.NETコアソリューションでは、このコードは動作しません toolbarId -1に設定されています。だから私の推測では、問題はOR節の反対側のどこかにあります。それが私が立ち往生している場所です。私は誰もが以前この問題を見て、それを修正する方法を知っているのだろうかと思っていた? EFコアとEF6との違いは?私はいくつかの異なる修正を試み、解決策をいくつかの場所で調べ、空になった。

受け入れられた回答

さて、もう少しそれを試して、問題が何であるかを知りました。

   var allFolderAncestors = (from f in context.MENU_MenuFolders
                             from mtf in context.MENU_MenuToolbar_MenuFolders
                                                .Where(x => x.MenuFolderId == f.Id 
                                                     || x.MenuFolderId == f.ParentFolderId)
                                                .DefaultIfEmpty()
                             where (toolbarId == -1 
                             || (mtf != null && mtf.MenuToolbarId == toolbarId)) 
                             && f.Id != 0
                             select new
                             {
                                 AncestorFolderId = f.Id,
                                 AncestorParentFolderId = f.ParentFolderId,
                                 Id = f.Id,
                                 ParentFolderId = f.ParentFolderId
                             }).ToList();

ORの後のwhere節では、明らかに.NET Coreは三項演算子を好まない。これは、この問題に遭遇する可能性のある他の人に役立ちます。



Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ