1

...しかし、それはnullではありません。

参考までに - このエラーには多くのスレッドが存在しますが、匿名型を使用しているものはありません。

Linq クエリで奇妙な InvalidOperationException を取得しています。

メッセージ: 「実体化された値が null であるため、値の型 'Int32' へのキャストは失敗しました。結果の型のジェネリック パラメーターまたはクエリは、null 許容型を使用する必要があります。」

紛らわしいのは、匿名型を作成するときにエラーが発生することです。

var workstepid = 484,449;

var wsData = ion.xWorkSteps
   .Where(w => w.WorkStepId == workstepId)
   .Select(w => new
   {
       w.WorkStepId,
       w.ServiceId,
       w.Service.TitleId,
       w.Service.Title.OrderId,
       w.Service.Title.AltTitleId
   }).SingleOrDefault();

LinqPad では、この特定のクエリは問題なく実行され、使用される workstepId は匿名型の各プロパティの整数値を返します。では、どのプロパティにも null 値がないのに、なぜキャスト エラーが発生するのでしょうか!?

参考までに、最後のプロパティ AltTitleId は null 許容の int であり、他のプロパティは int です。また、このコードは数週間前に書かれたもので、今日までこのエラーは発生しませんでした。私のEFで何かファンキーですか?

編集:解決済み

データベースでソフト削除を使用し、削除されたレコードを Active=0 に設定します。非アクティブなレコードを除外する edmx テーブルの EF にプロパティ セットがあることがわかります (Active=1 のフィルター)。当然、これは Linqpad には影響せず、期待される結果が得られますが、これはテストしていた古いレコードであるため、タイトル レコード (Service.Title) は Active=0 とマークされていたため、null を返していました。

助けてくれてありがとう。

4

4 に答える 4

0

サービス/タイトル/注文 ID がどこかにない可能性がありますが、int 匿名型として宣言されている場合は int (null 不可) が必要ですが、データベースからは null が返されます。次のように書き直してみてください。

var workstepid = 484,449;

var wsData = ion.xWorkSteps
   .Where(w => w.WorkStepId == workstepId)
   .Select(w => new
   {
     WorkStepId = (int?)w.WorkStepId,
     ServiceId = (int?)w.ServiceId,
     TitleId = (int?)w.Service.TitleId,
     OrderId = (int?)w.Service.Title.OrderId,
     w.Service.Title.AltTitleId
   }).SingleOrDefault();
于 2013-11-05T11:48:04.927 に答える
0
var workstepid = 484,449;

var wsData = ion.xWorkSteps
   .Where(w => w.WorkStepId == workstepId)
   .Select(w => new
   {
      w.WorkStepId.Value,
      w.ServiceId.Value,
      w.Service.TitleId.Value,
      w.Service.Title.OrderId.Value,
      w.Service.Title.AltTitleId.Value
   }).SingleOrDefault();

こんにちは、null 値を受け入れるには、int データ型に .Value を追加する必要があります。お役に立てれば

于 2013-11-05T07:01:21.210 に答える
0

nullable の場合w.WorkStepIdは、変数を次のように設定してみてください...

int? workstepid = 484449;
于 2013-11-05T07:05:34.053 に答える
0

問題は SingleOrDefault() にあると思います。

0 レコードを取得するとします。

var workstepid = 484,449;

var len = ion.xWorkSteps
   .Where(w => w.WorkStepId == workstepId)
   .Length();

そして、匿名タイプをデフォルトで置き換える必要があります(これがSingleOrDefaultの機能です)が、匿名タイプのデフォルトはありません。

次のように変更してみてください。

    var wsData = ion.xWorkSteps
   .Where(w => w.WorkStepId == workstepId)
   .Select(w => new
   {
       w.WorkStepId,
       w.ServiceId,
       w.Service.TitleId,
       w.Service.Title.OrderId,
       w.Service.Title.AltTitleId
   })
   .Take(1)
   .ToArray();
于 2013-11-05T07:22:19.080 に答える