簡體   English   中英

該SQL語句的LINQ與SQL查詢表達式等效的內容是什么?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM