【问题标题】:What is the equivalent LINQ to SQL query expression of this SQL statement?此 SQL 语句的等效 LINQ to SQL 查询表达式是什么?
【发布时间】:2017-09-25 16:30:50
【问题描述】:

SQL 查询运行正常:

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”失败,因为物化了 值为空。结果类型的泛型参数或查询 必须使用可空类型。

【问题讨论】:

  • 这个错误是不言自明的。您有一个可以为空的 DB 值,并且您正在尝试将其转换为不可为空的 int
  • 谢谢 Yannick Meeus。我期待有人编辑/格式化我的问题。
  • 在某些情况下,它不是一个简单的 DB 可空字段,当返回的集合为空时,非可空字段可能会发生这种情况

标签: c# sql asp.net linq tsql


【解决方案1】:

在某些情况下,直接的 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

【讨论】:

  • 感谢您的评论。它解决了我的问题,但需要一些额外的代码来修复 NULL 错误。我添加了这段代码: var gt = trans.GroupBy(t => t.Operator).Select(n => new { Operator = n.Key, Amount = n.Sum(a=>a.Amount.GetValueOrDefault(0) ) }).ToList();
  • @Iqbal 这是完全正确的,尽管在这种情况下我的偏好是尽早摆脱null。编辑包括在内。
  • 对不起,我是新用户,不能投票给你。你解决了我的问题。谢谢。
  • @Iqbal 不过你可以accept the answer
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多