繁体   English   中英

具有多个联接的Linq查询

[英]Linq query with multiple joins

我正在使用Entity Framework与我的数据库一起使用,我需要形成LINQ查询的帮助,该查询将帮助我获取LoginId和AccNumber列。 对于每个单独的AccNumber,我只需要1个LoginId,无论它是哪个LoginId,都没有关系。 目前,大约有80万个LoginId,只有约3000个AccNumber。

因此,最后我需要与1 LoginId关联的1 AccNumber。 所以我应该有〜3000行和2列。

这是我需要加入的表:

项目

ItemId,AccNumber,其他不相关的列

Block_Item

ItemId,BlockId和其他不相关的列

Bookversion_Block

BookversionId,BlockId和其他不相关的列

Sudent

LoginId,BookversionId,其他不相关的列


理想情况下,我想使用LINQ复制此SQL查询(只是尝试提供尽可能多的信息)

select max(StudentId) as StudentId, BookletVersionId into #ST from Student
group by BookletVersionId

select #ST.BookletVersionId, LoginId into #T1 from #ST
join Student ST on #ST.StudentId = ST.StudentId

select BookletVersionId, BlockId into #BVB from BookletVersion_Block
where
                BookletVersionId in (select BookletVersionId from #ST)

select #T1.BookletVersionId, #BVB.BlockId, LoginId into #T2 from #T1
join BookletVersion_Block #BVB on #T1.BookletVersionId = #BVB.BookletVersionId

select max(BlockId) as BlockId, ItemId into #BI from Block_Item
where
                BlockId in (select BlockId from #T2)
group by ItemId

select BookletVersionId, #T2.BlockId, ItemId, LoginId into #T3 from #T2
join #BI on #T2.BlockId = #BI.BlockId

select max(LoginId) as LoginId, AccessionNumber from #T3
join Item I on #T3.ItemId = I.ItemId
group by AccessionNumber order by LoginId

这是我尝试的方法,但是,返回的结果不正确,并且像183,000条记录一样返回。 显然是因为我的LINQ查询不正确,这就是为什么我寻求帮助。

var q = (from items in context.Items
         join context.Block_Item
         on items.ItemId equals bi.ItemId into bi
         join context.BookletVersion_Block
         on bi.Select(x => x.BlockId).FirstOrDefault() equals BVB.BlockId into BVB
         join context.Students
         on BVB.Select(x => x.BookletVersionId).FirstOrDefault() equals st.BookletVersionId into st
          //'VH098334'
          select new { LoginId = st.Select(x => x.LoginId).FirstOrDefault().ToString(), AccNum = items.AccessionNumber.ToString() });

您可以在select语句中使用子查询以及FirstOrDefault来获取LoginId

var query =
   from items in context.Items
   select new 
   {
      AccNum = items.AccessionNumber,
      LoginId = (
         from bi in context.Block_Item  
         join bb in context.BookletVersion_Block on bi.BlockId equals bb.BlockId
         join st in context.Students on bb.BookversionId equals st.BookversionId
         where items.ItemId == bi.ItemId
         select st.LoginId
      ).FirstOrDefault()
   };

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM