Linq查询-多个连接和选择2列

本文关键字:选择 2列 连接 查询 Linq | 更新日期: 2023-09-27 18:04:44

我正在使用实体框架与我的DB工作,我需要帮助形成一个LINQ查询,这将帮助我获得列LoginId和AccNumber。我只需要1 LoginId为每一个AccNumber,不管它是哪个LoginId。目前,有大约800K个loginid,只有5000个AccNumber。因此,最后我需要1个AccNumber与1个LoginId相关联。所以我应该有5000行2列


这些是我需要连接的表:

ItemId, AccNumber,其他不相关的列

Block_Item

ItemId, BlockId,其他不相关的列

Bookversion_Block

BookversionId, BlockId,其他不相关的列

Sudent

LoginId, BookversionId,其他不相关的列


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

select
LoginId,
AccessionNumber
from Item I
outer apply (select top 1 * from Block_Item where I.ItemId = ItemId) BI
outer apply (select top 1 * from BookletVersion_Block where BlockId = BI.BlockId) BVB
outer apply (select top 1 LoginId from Student where BookletVersionId = BVB.BookletVersionId) ST

这就是我所尝试的,然而,我得到的结果是不正确的,我得到了183,000条记录,执行这个需要10分钟。"var unique = q.ToList();"这一行花费了很长时间。

using (var context = new MyContext())
{
    context.Database.CommandTimeout = 1200;
    var listOfAccessionNumbers = GetListOfAllAccessionNumbers(context);
    var q = (from items in context.Items
             join blockItem in context.Block_Item
             on items.ItemId equals blockItem.ItemId into bi
             join bookletVersion in context.BookletVersion_Block
             on bi.Select(x => x.BlockId).FirstOrDefault() equals bookletVersion.BlockId into BVB
             join student in context.Students
             on BVB.Select(x => x.BookletVersionId).FirstOrDefault() equals student.BookletVersionId into st
             //'VH098334'
             select new { LoginId = st.Select(x => x.LoginId).FirstOrDefault().ToString(),
             AccNum = items.AccessionNumber.ToString() });
     **var uniques = q.ToList();**
     IList<string> listOfLogins = new List<string>();
     foreach (var accessionNumber in listOfAccessionNumbers)
     {
         var i = q.ToList().Find(x => x.AccNum.Contains(accessionNumber));
         listOfLogins.Add(i.LoginId);
     }
}

Linq查询-多个连接和选择2列

试着分开你的linq操作,希望看到哪一个是最长的,哪里出错了。

另外,我建议使用字典, accNumber作为键,LoginID作为值,这样你就可以确保每个accNumber与1且只有1 LoginID相关联。

Dictionary<string, string> uniques = new Dictionary<string, string>();
var q = (from items in context.Items
         join bi in context.Block_Item
         on items.ItemId equals bi.ItemId
         select items).ToList();
//var first = bi.Select(x => x.BlockId).FirstOrDefault();
var val = (from b in context.BookletVersion_Block.Select(bv => bv.BlockId)
           join a in q on b equals q.FirstOrDefault().BlockId into BVB
           join c in context.Students on BVB.FirstOrDefault().BookletVersionId equals c.BookletVersionId into st
           select new { LoginId = st.Select(x => x.LoginId).FirstOrDefault().ToString(), AccNum = a.AccessionNumber.ToString() });
//if (!uniques.ContainsKey(bi.AccNum))
    //uniques.Add(val.AccNum, val.LoginId);
uniques = val.ToDictionary(c => c.AccNum, c => c.LoginId);

还没有测试过,所以请告诉我所花费的时间以及你是否得到了正确的值。

字典应该确保你得到5000个值,但我不知道为什么它需要这么长时间,但让我们先修复记录的数量问题。