[英]What will be the LINQ equivalent query of SQL GROUP BY statement?
[英]What is the equivalent LINQ to SQL query expression of this SQL statement?
SQL查詢運行OK:
select o.OpName,isnull(Amount,0) from Setup_tblOperator o
left join
(
select t.opid,sum(isnull(t.Amount,0)) Amount from
Load_tblTransaction t
where cast(t.RequestTime as date)='2017-04-24'
group by t.opid
) t on t.OpId=o.OpId
where o.IsActive=1
我嘗試在LINQ to SQL中使用以下代碼:
var trans = (from o in mouDataEntities.Setup_tblOperator
join t in mouDataEntities.Load_tblTransaction
on o.OpId equals t.OpId into ot
from n in ot.Where(
t => DbFunctions.TruncateTime(t.RequestTime) ==
DbFunctions.TruncateTime(seldate))
.DefaultIfEmpty()
select new
{
Operator = o.OpName,
Amount= n.Amount
});
var gt = trans.GroupBy(t => t.Operator)
.Select(n => new { Operator = n.Key, Amount = n.Sum(a=>a.Amount) })
.ToList();
它拋出一個錯誤:
強制轉換為值類型'System.Int32',因為實例化值為null。 結果類型的通用參數或查詢必須使用可為空的類型。
在少數情況下,直接的SQL到C#的轉換被接受,但在運行時失敗。 在C#中, set.DefaultIfEmpty().Select(n => n.Amount)
(其中n.Amount
類型為int
的結果類型為IEnumerable<int>
。 如果set
為空,它將失敗並返回NullReferenceException
,因為在這種情況下, n
也將變為null
。 因此,沒有理由需要int?
,因為結果永遠不會為null
。
在SQL中,這並不容易。 檢索LEFT JOIN
引入的默認行的列是有效的,並產生NULL
。
但是C#代碼期望一個int
類型的值,並且int
不能為null
。
您需要找到某種技巧來欺騙類型系統,以便可以指定應如何處理null
。 一個簡單的轉換就足夠了:
更改
Amount = n.Amount
至
Amount = (int?) n.Amount
或者,將null
變為0
,
Amount = (int?) n.Amount ?? 0
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.