【问题标题】:Why is this ternary statement evaluated as NULL?为什么这个三元语句被评估为 NULL?
【发布时间】:2012-07-11 16:55:24
【问题描述】:

以下代码中的第一个三元语句返回“null”。 myID 返回为空。但是,如果三元语句工作正常,并且 a.someID 为空,则 myID 应返回为 -1。 myID 是一个可为空的 int 字段。你知道为什么我没有得到-1吗?谢谢。

public List<myView> GetRecords()
{
    myEntities entities = new myEntities();

    var myValue = (from a in entities.myEntitiesA
                   join b in entities.myEntitiesB on a.myID equals b.myID into myEntitesC
                   from c in myEntitesC.DefaultIfEmpty()
                   select new myView
                   {
                       myID = a.someID == null ? -1 : a.someID,
                       myName = a.myName,
                       myAlternateID = c.myID == null ? -1 : c.myID,
                       myAlternateName = c.myName == null ? "" : c.myName,
                   }).Distinct().OrderBy(b => b.myName).ToList();

    return (myValue);
}

编辑 - 为了测试,我已经摆脱了 DefaultIfEmpty(),但我的结果是一样的。

【问题讨论】:

  • 另外 - 你可能想处理你的myEntities
  • 你如何确定myIDnull
  • @Razvan - someID 也是可以为空的 int。
  • @JaredPar - 我可以看到 someID 在基础数据库记录中为空。
  • @WEFX 这将表明 null 最终被写入记录,而不是从上述查询中以 null 的形式返回。有没有在运行的程序中查看GetRecords的结果,看myID是不是null

标签: c# linq ternary-operator


【解决方案1】:

我认为您可能想要使用空合并运算符 ??

// y = x, unless x is null, in which case y = -1.
        int y = x ?? -1;

来自?? Operator Documentation

【讨论】:

  • 有效点,但由于它等同于他已经在做的事情,因此不能解决所述问题。
【解决方案2】:
  from c in myEntitesC.DefaultIfEmpty()
  select new myView
  {
    ...
    myAlternateID = c.myID == null ? -1 : c.myID, 

如果 c 为空怎么办?

    myAlternateID = (c == null || c.myID == null) ? -1 : c.myID, 

Linq 是一种针对许多不同实现使用通用语法声明查询的方法。您的特定查询实现可能不是 LinqToObjects(在静态类 System.Linq.Enumerable 中实现)。为了获得最佳答案,最好指定哪个系统正在执行您的查询。

【讨论】:

  • 如果 c 为 null 你会得到一个异常,而不是一个空赋值
  • @rotan - 不保证异常。如果查询由 LinqToSql 翻译,则不会发生异常。另外 - 如果 DefaultIfEmpty 唯一能为您做的就是生成异常,为什么还要编写它?
  • 我已经摆脱了 DefaultIFEmpthy(),但同样的问题仍然存在。
  • @WEFX:尽管您的类名似乎表明您正在使用 Linq to Entities,但您还没有回答 LINQ 正在与什么对话。
  • @comecme - 是的,我在 MVC3 / EF4 Web 项目中使用 Linq to Entities。
【解决方案3】:

可能 DefaultIfEmpty() 例程被触发,因此您的三元运算符没有被执行,而是正在创建一个新的 myView。

【讨论】:

  • 我已经摆脱了 DefaultIFEmpthy(),但同样的问题仍然存在。
【解决方案4】:

虽然所有其他答案似乎都有效,但它们都不适合我。由于我是从 JsonResult 控制器方法调用此 GetRecords() 方法,因此我最终在 JsonResult 上执行了额外的逻辑,第二次检查 NULL。当然,这是一个多余的检查,所以并不理想,但它确实有效。

【讨论】:

    猜你喜欢
    • 2018-10-15
    • 1970-01-01
    • 1970-01-01
    • 2020-04-03
    • 1970-01-01
    • 2014-05-11
    • 2019-11-11
    • 2012-08-15
    • 2013-08-27
    相关资源
    最近更新 更多