Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在Linq查询中应用自连接?_C#_Linq_Nhibernate_Linq To Sql - Fatal编程技术网

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();