C# 如何在Linq查询中应用自连接?
书桌C# 如何在Linq查询中应用自连接?,c#,linq,nhibernate,linq-to-sql,C#,Linq,Nhibernate,Linq To Sql,书桌 Id VendorId ASIN Price -- -------- ---- ------ 1 gold123 123 10 2 sil123 123 11 3 gold456 456 15 4 gold678 678 12 5 sil456 456 12 6 gold980 980 12 我想写一个linq查询,如果sil供应商id不存在,它
Id VendorId ASIN Price
-- -------- ---- ------
1 gold123 123 10
2 sil123 123 11
3 gold456 456 15
4 gold678 678 12
5 sil456 456 12
6 gold980 980 12
我想写一个linq查询,如果sil供应商id不存在,它将返回对应于每个黄金的行。供应商Id的最后三位数字对应于该行的ASIN列
Ex-对于gold123,存在相应的sil123,因此不会返回行,但对于gold678和gold980,不存在相应的sil。因此,这些行将被返回
我试着跟着
var gold = _repository.Query<Books>().Where(x =>
x.VendorId.Contains("gold"))
.OrderBy(x => x.Id).Skip(0).Take(500).ToList();
var asinsForGold = gold.Select(x => x.ASIN).ToList();
var correspondingSilver = _repository.Query<Books>().Where(x =>
x.VendorId.Contains("sil")
&& asinsForGold.Contains(x.ASIN)).ToList();
var correspondingSilverAsins = correspondingSilver.Select(x => x.ASIN).ToList();
var goldWithoutCorrespondingSilver = gold.Where(x =>
!correspondingSilverAsins.Contains(x.ASIN));
var gold=\u repository.Query()。其中(x=>
x、 VendorId.包含(“黄金”))
.OrderBy(x=>x.Id).Skip(0).Take(500).ToList();
var asinsForGold=gold.Select(x=>x.ASIN.ToList();
var correspondingSilver=_repository.Query()。其中(x=>
x、 VendorId.包含(“sil”)
&&包含(x.ASIN)).ToList();
var correspondingSilverAsins=correspondingSilver.Select(x=>x.ASIN.ToList();
var goldwithout correspondingsilver=gold。其中(x=>
!对应的ilverasins.Contains(x.ASIN));
我们是否可以应用自连接或更好的方法只在一个查询中获得结果,而不是在两个查询和其他几个列表语句中获得结果。看看它是否有帮助-
var goldWithoutCorrespondingSilver = from b1 in books
join b2 in books on b1.ASIN equals b2.ASIN
where b1.VendorId.Contains("gold")
group b2 by b1.VendorId into g
where !g.Any(x => x.VendorId.Contains("sil"))
select g.FirstOrDefault();
我所做的是-
- 具有匹配ASIN的选定记录
- 按VendorID将它们分组
- 所选的没有sil的设备
var goldWoSilver=\u repository.Query()
其中(x=>x.VendorId.Contains(“黄金”))
.Where(x=>!\u repository.Query()
.Any(s=>s.ASIN==x.ASIN
&&s.VendorId.包含(“sil”))
.OrderBy(x=>x.Id).Skip(0).Take(500).ToList();
在许多情况下,这是一个成功的方法:使用要返回的实体启动查询,并且只添加谓词。一般来说,联接不应用于筛选,而应仅用于收集相关数据,尽管在这种情况下,应使用导航属性隐式转换为SQL联接
var goldWoSilver = _repository.Query<Books>()
.Where(x => x.VendorId.Contains("gold"))
.Where(x => !_repository.Query<Books>()
.Any(s => s.ASIN == x.ASIN
&& s.VendorId.Contains("sil"))
.OrderBy(x => x.Id).Skip(0).Take(500).ToList();