1

以下代码中的第一个三元语句返回“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() ,但我的结果是一样的。

4

4 回答 4

0

我认为您可能想要使用 null 无合并运算符,它是??

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

?? 操作员文档

于 2012-07-11T17:00:13.763 回答
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(在 static class 中实现System.Linq.Enumerable)。要获得最佳答案,最好指定哪个系统正在执行您的查询。

于 2012-07-11T17:10:43.003 回答
0

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

于 2012-07-11T17:39:28.297 回答
0

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

于 2012-07-30T02:12:39.057 回答