【问题标题】:?: Operator in LINQ Query?: LINQ 查询中的运算符
【发布时间】:2008-11-12 02:08:39
【问题描述】:
  • 如何在 LINQ 查询的 SELECT 子句中使用 ?: 运算符?如果这不能做到,我怎么能效仿呢?目标是在我的选择子句中获得一个 CASE 块。正如您可能怀疑的那样,我收到一个错误:无效的匿名类型成员声明符。必须使用成员分配、简单名称或成员访问来声明匿名类型成员。

  • 这是正确的方式,还是充分的方式,说“从 a.ipid=i.id 上的内部连接 ​​i 在 i.uid=u.id 上连接 u”?如果没有,请提供一份。谢谢。

    var query =
        from a in db.tblActivities
        from i in db.tblIPs
        from u in db.tblUsers 
        select new {
            u.UserName == null
                ? i.Address
                : u.UserName,
            a.Request,
            a.DateTime };
    

【问题讨论】:

    标签: c# linq linq-to-sql


    【解决方案1】:

    当创建一个匿名类型(你在没有指定类型的情况下使用“新”做的事情)时,你必须为每个属性指定成员名称。从您的示例来看,它看起来像这样:(也修复了您的连接)

    var query = from a in db.tblActivities
                join i in db.tblIPs on a.ipid equals i.id
                join u in db.tblUsers on i.uid equals u.id
                select new {
                   UserName = (u.UserName ?? i.Address),
                   Request = a.Request,
                   Date = a.DateTime
                };
    

    您也可以按照自己的方式设置用户名:

    UserName = (u.UserName == null) ? i.Address : u.UserName,
    

    但是 ??运算符更简洁。类似于 SQL 中的“isnull”。

    【讨论】:

    • 太棒了。那非常接近,让我得到了答案:从 A in TblActivities join i in TblIPs on a.IPID equals i.ID join u in TblUsers on a.UID equals u.ID select new { UserName = (u.UserName ? ? i.Address), Request = a.Request, Date = a.DateTime }
    • 如果您看到我的示例,您可以使用表别名来跳过连接语句。
    • 没有连接,您刚刚实现了笛卡尔连接(叉积)。如果每个表有 10 行,您将得到 1000 个结果。相信我,你真的希望这些连接在那里。
    • @GalacticCowboy,我很确定你错了。请注意,我提出的查询应该使用内置的 FK 关系进行连接。我没有在每一行上使用 db。见这里:stackoverflow.com/questions/283103/linq-to-sql-foreign-keys
    • @Jason,你是对的,我错过了你使用内置关系的事实。如果他正在使用它们(并且不确定他为什么不能......)那会很好用。我也在你的其他帖子中回复了。
    【解决方案2】:

    您必须使用 join 关键字,并定义实体之间的关系才能进行正确的内部连接。

    Here你可以找到一些例子,我也强烈推荐你得到LinqPad,它是一个非常有价值的工具来测试你的查询,也很好学,它有200多个例子。

    【讨论】:

      【解决方案3】:

      如果你只检查 null,你也可以使用 ??

      string something = null;
      string somethingElse = something ?? "default value";
      

      至于上面的例子,正确的做法是……

      string something = (somethingElse == null ? "If it is true" : "if it is false");
      

      括号不是必需的,但它们确实有助于阅读。

      【讨论】:

      • 您的逻辑适用于标准字符串操作,但此 LINQ 仅按直觉预期的方式工作了一半...同样的错误。
      • 奇怪...我之前在 LINQ 查询中使用过这个...第二部分。
      【解决方案4】:

      真的。这个问题取决于您的 linq 表达式将返回的 IQueryable 的特定实现。我看到你有 db.XXX 那么你是使用 linq to sql 还是一些 linq to 数据存储?如果是这样,IQueryable 的具体实现将需要有一种方法将您的表达式转换为存储表达式。 除了上面的 cmets,其他一些 cmets 是正确的,在匿名类型中您必须为每个成员指定一个名称。这确实是你的错误。

      【讨论】:

      • db 在这种情况下是我的 Linq to SQL 类的 DataContext。
      • 我明白了,这是有道理的。您在所有这些之间找到了您需要的答案吗?
      【解决方案5】:

      我对 Linq to SQL 还很陌生,但我很确定它会是这样的:

      var query =
          from a in db.tblActivities
          from i in a.tblIPs
          from u in i.tblUsers 
          select new
          {
              userName = (u.UserName == null)
                  ? i.Address
                  : u.UserName,
              a.Request,
              a.DateTime
          };
      

      if 语句需要在括号中,结果在括号之外。至于连接,您按照从一到多的链条向下移动。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多