ゼロ以外の残高の注文を返す linq to sql クエリがあります (実際、クエリは少し複雑ですが、簡単にするために一部の詳細を省略しました)。このクエリは、CardItems を含まない注文も返す必要があります (両方のサブクエリが T-SQL で NULL を返し、2 つの NULLS を比較すると FALSE になるため、比較のためにサブクエリの NULL 結果値を 0 に変換します)。
var q = (from o in db.Orders
where db.Cards(p =>
p.OrderId == o.Id
&& p.Sum + (db.CardItems.Where(i => i.IncomeId == p.Id)
.Sum(i => (double?)i.Amount) ?? 0)
!= (db.CardItems.Where(i => i.DeductId == p.Id)
.Sum(i => (double?)i.Amount) ?? 0)
).Any()
select o);
問題は、変換式 Sum(i => (double?)i.Amount) ?? 0は COALESCE 演算子を生成します。これは、サブクエリのために COALESCE をISNULLに置き換えたまったく同じ T-SQL クエリよりも 10 倍遅くなります。この状況で ISNULL を生成する可能性はありますか?