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操作,希望看到哪一个是最长的,哪里出错了。
另外,我建议使用字典, 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个值,但我不知道为什么它需要这么长时间,但让我们先修复记录的数量问题。