2016-09-19 3 views
0

Я использую Entity Framework для работы с моей БД, и мне нужна помощь в формировании запроса LINQ, который поможет мне получить столбцы LoginId и AccNumber. Мне нужно всего лишь 1 LoginId для каждого отдельного AccNumber, не имеет значения, в каком он был вход. В настоящее время существует около 800K LoginIds и только ~ 3000 AccNumber.Запрос Linq с несколькими объединениями

Следовательно, в конце мне нужно 1 AccNumber, связанное с 1 LoginId. Поэтому у меня должно быть ~ 3000 строк и 2 столбца.

Вот таблицы, мне нужно присоединившихся:

Элемента

Itemid, AccNumber, другие несущественные столбцы

Block_Item

Itemid, BlockId, другие несоответствующие столбцы

Bookversion_Block

BookversionId, BlockId, другие несущественные столбцы

Sudent

LoginID, 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

Есть ли у вас какие-либо отношения, установленные в вашем Entity Framework контексте? (например, 'item.Block'?) – StriplingWarrior

ответ

1

Вы можете использовать подзапрос вместе с 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() 
    }; 
+0

Отлично, спасибо! Кажется, что-то делает, но пришло время после 20 минут! Любая идея, как ускорить его, так что это не так долго? –

+0

@NikolayAdvolodkin - вам, вероятно, не хватает указателя на одном из столбцов 'where' /' join' – Aducci

Смежные вопросы