【问题标题】:Linq to SQL query SubQueryLinq to SQL 查询子查询
【发布时间】:2013-07-12 04:10:28
【问题描述】:

我对@9​​87654321@提出的问题有一个后续问题

这是我所有的 Linq 查询

这是查询 1:

var RCode = from a in DbEntity.MobileAssetDowntimeReasonCodes 
            where a.MobileAssetCategoryId.Equals(reasonCode) 
            select new 
            { 
                a.JdeReasonCode 
            };

ReasonCode.DataSource = RCode.ToList();
ReasonCode.DataBind();

这带来了在 DataGrid 中显示的结果代码。

这里是查询 2,它也有效

var RJDEReasonCode = from a in JDETable.F0005
                                 where
                                   a.DRSY.Equals("00") &&
                                   a.DRDL01 != null &&
                                   (a.DRRT.Equals("W4") ||
                                   a.DRRT.Equals("W5")) &&
                                   a.DRKY.Trim() == "801"
                                 select new
                                 {
                                     CATEGORY_CODE = a.DRRT,
                                     REASON_CODE = a.DRKY,
                                     DESCRIPTION = a.DRDL01
                                 };

但我不想硬编码“801”,而是想将查询 1 的结果传递给查询 2,并在我的数据网格中显示查询 2 结果。我该怎么做?

【问题讨论】:

  • 查询#1 是否返回801?试试a.DRKY.Trim() == RCode.FirstorDefault().JdeReasonCode
  • 查询一个返回一个代码列表,例如 801 、 802,803 我想在第二个查询中运行每个代码以获取该代码的详细信息并显示它
  • 您可以在循环中执行此操作,并将每次迭代的结果连接到单个集合。或者您可以将您的 LINQ 语句修改为类似于:RCode.Contains(a.DRKY.Trim())
  • 阅读this answer

标签: c# linq oracle


【解决方案1】:

这样的?

List<string> RCode = DbEntity.MobileAssetDowntimeReasonCodes
    .Where(a=>a.MobileAssetCategoryID.Equals(reasonCode))
    .Select(a=>a.JdeReasonCode).ToList();

var RJDEReasonCode = JDETable.F0005
    .Where(a=>a.DRSY.Equals("00") && a.DRDL01 != null &&
             (a.DRRT.Equals("W4") || a.DRRT.Equals("W5")) &&
              RCode.Any(code => code.Contains(a.DRKY.Trim())))
    .Select(a=>new { CATEGORY_CODE = a.DRRT,
                     REASON_CODE = a.DRKY,
                     DESCRIPTION = a.DRDL01
    });

使用Enumerable.Any Method 检查检索到的 RCodes 是否是 F0005 表中的代码之一。

【讨论】:

  • 语法缺少一些东西 .Select(a=>a.JdeReasonCode).ToList());和 .Select(a=>new { CATEGORY_CODE = a.DRRT, 显示错误它说 'bool' 不包含 'select' 的定义并且没有扩展方法..
  • @user2315840 抱歉,我每一个都少了一个括号。
  • 这工作。非常感谢学习 Linq 是一次美妙的体验。
  • @user2315840 必须从某个地方开始!
【解决方案2】:
var RJDEReasonCode = from a in JDETable.F0005
                     where
                         a.DRSY.Equals("00") &&
                         a.DRDL01 != null &&
                         (a.DRRT.Equals("W4") ||
                         a.DRRT.Equals("W5")) &&
                         //and use it checking if it contains a.DRKY.Trim() 
                         RCode.Contains(a.DRKY.Trim())
                      select new
                      {
                                     CATEGORY_CODE = a.DRRT,
                                     REASON_CODE = a.DRKY,
                                     DESCRIPTION = a.DRDL01
                      };

【讨论】:

  • 你能详细说明你的答案吗?我不明白这一点,因为我是 Linq 的新手
  • 不起作用,它说 Contains 有一些无效参数,第二个错误说 Argument1: connot convert from 'string to 'anonymoustype#1'
  • JdeReasonCode是什么类型
  • JdeReasonCode 在我设置断点时显示 linq 类型行
猜你喜欢
  • 2010-12-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多