【问题标题】:C# linq2sql selecting multiple columnsC# linq2sql 选择多列
【发布时间】:2012-02-03 22:10:54
【问题描述】:

我很难在 carCheckouts 表中选择多个列。我只想要我知道 pk 的一行中的 startMiles 和 endMiles。我的 linq 语句正确吗?如果是这样,我如何将 b.startMiles 和 b.endMiles 转换为可用变量?谢谢

var m = (from b in db.carCheckouts
where b.pk == primaryKey
select new {b.startMiles, b.endMiles});

【问题讨论】:

    标签: c# winforms linq-to-sql c#-4.0


    【解决方案1】:

    您当前的查询返回匿名类型的IQueryable - 但听起来您想要一个单个 项:

    var m = (from b in db.carCheckouts
    where b.pk == primaryKey
    select new {b.startMiles, b.endMiles}).Single();
    

    现在您可以使用m 的属性了:

    Console.WriteLine("Start Miles:"  + m.startMiles);
    

    【讨论】:

    • 了解 Single() 调用只有在查询的结果完全一致时才会返回而不会出错。这对于搜索您知道存在的 PK 应该是有效的,但在其他情况下,可能没有匹配过滤器的此类记录,或者很多。如果有 0 或 1 个项目,SingleOrDefault 将无异常返回; FirstOrDefault 将适用于零到多个结果的情况。
    【解决方案2】:

    您已将 m 转换为匿名类型(实际上 m 将是该匿名类型的 IQueryable ),可以在它声明的范围内的任何地方使用。添加了匿名类型以允许这样的事情,因此您无需预先创建将保存这些值的类型,您可以即时创建类型。

    如果您只想拥有 1 而不是 IQueryable,您可以执行 .FirstOrDefault 或仅 .First 为您提供该匿名类型的 1 个实例。

    【讨论】:

      【解决方案3】:
      var m = (from b in db.carCheckouts
      where b.pk == primaryKey
      select new {b.startMiles, b.endMiles});
      
      double totalMiles;
      
      foreach(var item in m)
      {
          totalMiles = item.endMiles - item.startMiles;
      }
      

      【讨论】:

        【解决方案4】:

        你也可以使用

        选择新的 {b.startMiles, b.endMiles}).FirstOrDefault();

        在您的 linq 语句中

        【讨论】:

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