【问题标题】:How to join a table to two other tables with linq in a complex query?如何在复杂查询中使用 linq 将表连接到其他两个表?
【发布时间】:2018-01-03 08:24:50
【问题描述】:

我正在尝试编写一个从多个 sql 表中收集记录的 linq 查询。下表及其关系如下图所示。 已经通过表中的主键和外键建立的关系用黑线表示。 红线指定仅查询所需的关系,以便将记录限制为所需的记录。

这是我对 linq 查询的最佳尝试,但它确实提供了我预期的更多记录(不相关记录的组合)。

            var query = from wastewater in db.WasteWaters
                    join allowance in db.Allowances on wasterwater.WasteWaterId equals allowance.WasteWaterId
                    join chemical in db.Chemicals on allowance.ChemicalId equals chemical.ChemicalId
                    join sample in db.Samples on wastewater.WasteWaterId equals sample.WasteWaterId
                    join analysissample in db.Analyses on sample.SampleId equals analysissample.SampleId
                    join analysisallowance in db.Analyses on allowance.ChemicalId equals analysisallowance.ChemicalId

                    select new QueryModel
                    {
                        WasteWaterName =  wastewater.WasteWaterName,
                        SampleDescription = sample.SampleDescription,
                        Chemical = chemical.ChemicalName,
                        Result = analysis.AnalysisResult,
                        MaxAllowed = allowance.MaxAllowance
                    };
        return query;

我认为关键点是将表格“分析”与“样本”连接到“津贴”。

当我使用 sql 查询我的数据库时(我确信这样做是正确的),结果与 linq 查询结果不同。所以我的 linq 查询一定有问题。在相应的sql下面:

SELECT WasteWaters.WastewaterName, Samples.SmplDescription, Chemicals.ChemicalName, Allowances.MaxAllowance, Analyses.Result
FROM ((Chemicals INNER JOIN (WasteWaters INNER JOIN Allowances ON WasteWaters.WasteWaterId = Allowances.WasteWaterId)
ON Chemicals.ChemicalId = Allowances.ChemicalId) INNER JOIN Samples ON WasteWaters.WasteWaterId = Samples.WasteWaterId)
INNER JOIN Analyses ON (Analyses.ChemicalId = Allowances.ChemicalId) AND (Samples.SampleId = Analyses.SampleId);

任何有关此问题的帮助将不胜感激。

【问题讨论】:

  • 我不会使用 Linq to SQL,因为它几乎已经死了。如果可能的话,我会使用实体框架。然后,您可以从模板导航和自动创建表格。我不确定,但 Linq to Sql 可能有导航成员,因为我知道它有一些 EF 有的东西。你可以在哪里做类似于 YourObject.Include("ChildObject.ChildChildObject").Select(x => new { (combined properties) });不可能,只是一个建议。 msdn.microsoft.com/en-us/library/…

标签: sql linq linq-to-sql


【解决方案1】:

我可能猜想您需要将查询分组到废水上,这样您就不会为同一项目设置多行。

我不确定,但你肯定离答案不远。

告诉我。

【讨论】:

  • 你的意思是 GroupJoin ?,比如 -> 加入 db.Allowances on wastewater.WasteWaterId 等于 permit.WasteWaterId 到 WasteWaterGroup
  • 我的意思是按说明分组,但我不确定它是否有效。
  • 我不熟悉“按说明分组” -> 你能提供更多帮助或我可以谷歌/搜索的关键字吗?
  • 我认为它会是这样的:将废水按废水分组到 gr select new QueryModel{ WasteWaterName = gr.key.WasteWaterName, SampleDescription = //select in the list, Chemical = //select in列表,Result = //在列表中选择,MaxAllowed = //在列表中选择,}
【解决方案2】:

这对你有用吗?

var ans = from c in Chemicals
          join a in Allowances on c.ChemicalId equals a.ChemicalId
          join w in WasteWaters on a.WasteWaterId equals w.WasteWaterId
          join s in Samples on w.WasteWaterId equals s.WasteWaterId
          join a2 in Analyses on new { a.ChemicalId, s.SampleId } equals new { a2.ChemicalId, SampleId = a2.SampleId.Value }
          select new QueryModel {
              WasteWaterName = w.WasteWaterName,
              SampleDesciption = s.SampleDescription,
              Chemical = c.ChemicalName,
              MaxAllowed = a.MaxAllowance,
              Result = a2.Result
          };

【讨论】:

  • at 'join a2 in Analyses on new { ...' -> 我得到一条摆动的红线和消息:连接中的表达式之一不正确。调用“加入”时类型推断失败。
  • 你能发布分析、津贴和样品的课程吗?或者至少是涉及的所有字段的类型?
  • a2.SampleId 是 int 吗?当 s.SampleId 是 int -> 因此错误!但是 Samples.SampleId 与 SampleId 需要不可为空的 int 的其他表有关系。有没有办法在连接中强制转换 s.SampleId?
  • 我尝试访问 int 的值? - 不确定 EF 会用它做什么,你可以试试吗?
  • 我的意思是我更新了我的答案以使用 a2.SampleId.Value 删除类型的可空性,但我不确定 EF 是否会处理这个问题,但你可以试试。
猜你喜欢
  • 2023-03-05
  • 1970-01-01
  • 1970-01-01
  • 2018-10-14
  • 1970-01-01
  • 2023-02-25
  • 1970-01-01
  • 1970-01-01
  • 2016-01-12
相关资源
最近更新 更多