为什么这个三元语句被评估为NULL?

时间:2012-07-11 16:55:25

标签: c# linq ternary-operator

以下代码中的第一个三元语句返回“null”。 myID将返回null。但是,如果三元语句正常工作,并且a.someID为null,那么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(),但我的结果是一样的。

4 个答案:

答案 0 :(得分:0)

我想您可能想要使用??

的null无煤运算符
// y = x, unless x is null, in which case y = -1.
        int y = x ?? -1;

来自?? Operator Documentation

答案 1 :(得分:0)

  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中实现)。要获得最佳答案,最好指定执行查询的系统。

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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