【问题标题】:How to Join LINQ to another LINQ如何将 LINQ 加入另一个 LINQ
【发布时间】:2014-02-16 10:21:43
【问题描述】:

我有这样的查询

WITH CTE_KELOMPOKINFORMASI (KelompokInformasi, XBRLItem_ItemId) 
AS (
SELECT a.Id AS KelompokInformasi, c.XBRLItem_ItemId
FROM XBRLNamespaces a INNER JOIN XBRLHypercubes b 
ON a.XBRLView_ViewId = b.XBRLView_ViewId 
INNER JOIN XBRLHypercubeDimensionItems c 
ON b.XBRLHypercubeId = c.XBRLHypercube_XBRLHypercubeId 
WHERE a.Id like '%KBIK_AAKL%')

SELECT f.KelompokInformasi, e.Name AS DimensionName, c.Id AS Domain, 
d.Text AS Description FROM [dbo].[XBRLDefinitionRoleDomainItems] a
INNER JOIN [dbo].[XBRLDefinitionRoleDimensionItems] b
ON a.XBRLDefinitionRole_DefinitionRoleId = b.XBRLDefinitionRole_DefinitionRoleId 
INNER JOIN XBRLItems c ON a.XBRLItem_ItemId = c.ItemId 
INNER JOIN XBRLLabels d 
ON a.XBRLItem_ItemId = d.XBRLItem_ItemId 
INNER JOIN XBRLItems e 
ON b.XBRLItem_ItemId=e.ItemId 
INNER JOIN CTE_KELOMPOKINFORMASI f 
ON b.XBRLItem_ItemId=f.XBRLItem_ItemId 
WHERE b.XBRLItem_ItemId=f.XBRLItem_ItemId

我想将此 sql 查询移至 linq,我意识到 CTE 在 LINQ 中是不可能的。所以我分成2个部分。首先我创建一个这样的变量:

var KelompokInformasi = from x in ent.XBRLNamespaces
                                    join y in ent.XBRLHypercubes on x.XBRLView_ViewId equals y.XBRLView_ViewId
                                    join z in ent.XBRLHypercubeDimensionItems on y.XBRLHypercubeId equals z.XBRLHypercube_XBRLHypercubeId
                                    where x.Id.Contains("KBIK")
                                    select new
                                    {
                                        x.Id,
                                        y.XBRLItem_ItemId
                                    };

在第二部分我创建:

_list = (from a in ent.XBRLDefinitionRoleDomainItems
                     join b in ent.XBRLDefinitionRoleDimensionItems on a.XBRLDefinitionRole_DefinitionRoleId equals b.XBRLDefinitionRole_DefinitionRoleId
                     join c in ent.XBRLItems on a.XBRLItem_ItemId equals c.ItemId
                     join d in ent.XBRLLabels on a.XBRLItem_ItemId equals d.XBRLItem_ItemId
                     join e in ent.XBRLItems on b.XBRLItem_ItemId equals e.ItemId
                     join f in KelompokInformasi on b.XBRLItem_ItemId equals (int)f.XBRLItem_ItemId
                     where (b.XBRLItem_ItemId == (int)f.XBRLItem_ItemId)
                     select new MappingDomainRepository
                     {
                         KI = f.Id,
                         Dimension = e.Name,
                         Domain = c.Id,
                         Description = d.Text
                     }).ToList();

_list 来自List<MappingDomainRepository> _list = new List<MappingDomainRepository>();

在我上面的代码中,我想将我的_list 加入到var KelompokInformasi。在 var kelompokInformasi 我有 47 行但在 _list 我有 0 数据返回。

我的代码有什么问题?是否可以将我的 _list 加入到 var kelompokInformasi?

【问题讨论】:

标签: c# sql linq join


【解决方案1】:

您需要将第二部分更改为:

var other = (from a in ent.XBRLDefinitionRoleDomainItems
             join b in ent.XBRLDefinitionRoleDimensionItems on a.XBRLDefinitionRole_DefinitionRoleId equals b.XBRLDefinitionRole_DefinitionRoleId
             join c in ent.XBRLItems on a.XBRLItem_ItemId equals c.ItemId
             join d in ent.XBRLLabels on a.XBRLItem_ItemId equals d.XBRLItem_ItemId
             join e in ent.XBRLItems on b.XBRLItem_ItemId equals e.ItemId
             join f in KelompokInformasi on b.XBRLItem_ItemId equals (int)f.XBRLItem_ItemId
             where (b.XBRLItem_ItemId == (int)f.XBRLItem_ItemId)
             select new MappingDomainRepository
             {
                 KI = f.Id,
                 Dimension = e.Name,
                 Domain = c.Id,
                 Description = d.Text,
                 XBRLItem_ItemId  = a.XBRLItem_ItemId 
            };

...添加用于加入 CTE 的 XBRLItem_ItemId。

然后将两者结合在一起。我们有来自 CTE 的其他(上图)和 KelompokInformasi:

var result = from x in KelompokInformasi 
             join o in other on x.XBRLItem_ItemId equals o.XBRLItem_ItemId
             select new {KelompokInformasi = o.KelompokInformasi, 
                         DimensionName = o.Name, 
                         Domain = o.Id,
                         Description = o.Text
                        };

..这似乎是您选择的列。

【讨论】:

  • 感谢您回答我的问题。我已经像上面的代码一样更改了我的第二部分,但是在 var other 中我仍然得到 0 结果。当我在 Quick Watch 中查看 var other 时,我收到此消息“Empty”枚举没有结果“字符串”
  • 好的。这可能是要返回的正确值。我所做的只是接受您的声明并将 a.XBRLItem_ItemId 添加到选择中。我建议检查 SQL,并检查连接的逻辑是否正确(我不能这样做:我不知道你的数据是什么或意味着什么!)
  • 我将再次更正我的加入查询.. 感谢您提供的信息,这对 Simon 很有帮助 :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-09
相关资源
最近更新 更多