2016-09-19 91 views
0

我使用實體框架與我的數據庫一起工作,我需要幫助形成一個LINQ查詢,這將幫助我獲得列LoginId和AccNumber。每個AccNumber只需要一個LoginId,這與LoginId無關。就目前來看,大約有800K的LoginIds,只有大約3000個AccNumber。Linq查詢與多個連接

因此,最後我需要1個AccNumber與1個LoginId關聯。所以我應該有〜3000行和2列。

這裏有我需要連接的表:

項目

項目Id,AccNumber,其他無關列

Block_Item

項目Id,塊標識,其他不相關的列

Bookversion_Block

BookversionId,塊標識,其他不相關的列

Sudent

登錄ID,BookversionId,其他無關列


理想情況下,我想用複製這個SQL查詢LINQ(只是儘量提供儘可能多的信息)

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() }); 
+1

你有你的實體框架範圍內建立任何關係? (例如'item.Block'?) – StriplingWarrior

回答

1

您可以使用子查詢與FirstOrDefault沿着你的SELECT語句中,以獲得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() 
    }; 
+0

太好了,謝謝!似乎正在做一些事情,但20分鐘後超時!任何想法如何加速它,所以它不需要那麼長時間? –

+0

@NikolayAdvolodkin - 你可能在某個'where'/'join'列中缺少一個索引 – Aducci