Har*_*arm 12 c# t-sql linq linq-to-sql
我有一个linq to sql查询返回一些非零余额的订单(实际上,查询有点复杂,但为了简单起见,我省略了一些细节).此查询还应返回没有CardItems的订单(两个子查询在T-SQL中都返回NULL,并且比较两个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);
Run Code Online (Sandbox Code Playgroud)
问题是,转换表达式Sum(i =>(double?)i.Amount)?? 0 生成COALESCE运算符,由于其中的子查询,它比完全相同的T-SQL查询慢十倍,并且替换了COALESCE到ISNULL.在这种情况下是否有可能生成ISNULL?
根据我的经验,哄骗 linq 生成您想要的 SQL 充其量是一件麻烦事。如果您有一个比 linq 更好的查询实现(工作正常并且执行良好),请继续使用它,即使只是针对这一查询。
最快的方法可能是使用DataContext.ExecuteQuery<TResult>
. 它甚至会为您水合和处理返回的对象,就像 linq 本身生成查询一样。
http://msdn.microsoft.com/en-us/library/bb361109.aspx
许多人宁愿将此 SQL 放在存储过程中,尤其是在生产代码中。然后,您只需将存储过程映射到 linq 对象中,它的工作方式是相同的。与通常的情况一样,ScottGu 有一篇相当详细的文章介绍如何做到这一点: