LINQ to Entities を使用して読み取る非常に複雑なデータベースへの WCF レイヤーがあります。しかし、最近、奇妙なエラーが発生しました。クエリの実行時に null 参照を取得しますが、たまにしかありません (データベース内のデータは変更されません)。以下に説明する2つの一般的なケースがあり、それはどちらかが失敗するか、もう一方が失敗するかのどちらかです。接続が再初期化されるようにサービスにアクセスするサイトを再起動すると、役割が切り替わります。最初のケースは機能しますが、もう一方のケースは失敗しています。だから..私はかなり混乱しています。何か思いつく人はいますか?
ケース 1:
string code = "xxx";
int version = 1;
Language lang = Language.en;
var languages = this.uc.MainTable
.Expand(a => a.Program.Area)
.Expand(a => a.Plang)
.Expand(a => a.Lang)
.Where(a =>
a.Program.Code.Equals(code, StringComparison.OrdinalIgnoreCase)
&& a.Lang != null
&& a.Program.Version == version)
.ToList();
var language = languages.Where(a => a.Lang.LangID == (int)lang).SingleOrDefault();
上記の場合、列挙時にlanguage
,a.Lang
が null であり、メソッドは失敗します。繰り返しますが、これはたまにしかありません。入力パラメーターとデータベースの内容がまったく同じであれば、サービス接続を再初期化した後、クエリは再び機能します。最初のケースが成功すると、2 番目のケースは失敗するように見え、その逆も同様です。他のケースは次のとおりです。
ケース 2:
Language lang = Language.en;
var programs = this.uc.SomeTable
.Expand(a => a.Program)
.Expand(a => a.Plang)
.Expand(a => a.Program.Level)
.Where(a =>
a.Program.Version == 1
&& a.LangID == (int)lang
&& a.Program.Occasion.Any(b => b.StatusID != 3));
programs = programs.Where(a => a.Program.Occasion.Any(b => b.Date == "2010-01-01"));
がprograms
列挙さa.Program.Occasion
れると、最後の行が null になり、null 参照が発生します。繰り返しますが、これは断続的ですが、データベースとパラメーターは同じです。
何が原因なのか少しでもわかるとありがたいです...