LINQ语法-标准的顺序
我试图理解LINQ语法,但却被卡住了。所以我有这条线,它得到了所有的人的邮政编码,我正在寻找LINQ语法-标准的顺序,linq,Linq,我试图理解LINQ语法,但却被卡住了。所以我有这条线,它得到了所有的人的邮政编码,我正在寻找 IQueryable<int> PersonIDsWithThisPostcode = _context.Addresses .Where(pst => pst.Postcode.Contains(p)) .Select(b => b.PersonID); 我希望它是与此类似的东西,在这里,您查看一个容器,然后对照一个子集的值进行检查,看看您想要什么
IQueryable<int> PersonIDsWithThisPostcode = _context.Addresses
.Where(pst => pst.Postcode.Contains(p))
.Select(b => b.PersonID);
我希望它是与此类似的东西,在这里,您查看一个容器,然后对照一个子集的值进行检查,看看您想要什么
persons = persons.Where(ps => ps.PersonID.Contains(PersonIDsWithThisPostcode));
所以从SQL的角度来看,我会这样想
bucket = bucket.Where(bucket.Contains(listoffish));
bucket = bucket.Where(listoffish.Contains(bucket));
但似乎是这样的
bucket = bucket.Where(bucket.Contains(listoffish));
bucket = bucket.Where(listoffish.Contains(bucket));
我已经阅读了很多文档,但我无法理解这个看似简单的概念。如果您能帮助解释这种思维方式,我们将不胜感激
谢谢如果
PersonID
是int
您不能使用ps.PersonID.Contains
,因为int不是一个集合(或搜索子字符串的字符串)
唯一正确的方法是在一个集合中搜索您的PersonId
,该集合是PersonId with this postcode
-查询,返回所有匹配的PersonId
s。
单个PersonID
不包含集合,但PersonID
s的集合包含单个PersonID
因此,这是正确的,它返回所有PersonId
位于其他序列中的人员:
persons = persons.Where(ps => PersonIDsWithThisPostcode.Contains(ps.PersonID));
这不是:
persons = persons.Where(ps => ps.PersonID.Contains(PersonIDsWithThisPostcode));
考虑到C#和SQL是两种不同的语言,语法与SQL相反,这一点也不奇怪 在SQL中,您将列表放在右侧,因为
In
操作符读取“itemIncollection”
在C#中,不考虑LINQ,使用“collectioncontainsitem”代码检查集合是否包含项
当您在LINQ中使用转换为SQL的
Contains
时,LINQ提供程序会将一种语法转换为另一种语法,以避免C#程序员考虑差异。在集合myList.Contains(someId)
中检查单个ID是有意义的。但在本例中,我有两个集合,一个用于“persons”(表中的person记录集合),另一个用于“PersonidWithThisPostcode”(不同表中的PersonidWithThisPostcode集合),那么为什么PersonidWithThisPostcode.contains(一些人)
正确位置persons.contains(一些PersonidWithThisPostcode)
不是吗?关于如何比较集合的规则是什么?@Glyn collections包含单个项,而不是列表,因此myList.Contains(someOtherList)
没有意义。您可以询问myList
和someOtherList
是否共享项目,或者一个集合是否完全包含在另一个集合中,但您需要使用一个量词(Any
或All
方法对应于∃ 及∀ 那么“myList”是一个集合?如果您所做的只是返回公共元素,那么我应该能够互换使用myListA.Contains(myListB)
和myListB.Contains(myListA)
。人物模型是一个集合,不是吗?PersonidWithThisPostcode是一个集合,因为它是一个IQueryable,不是吗?@GlynContains
方法用于集合到项目的检查,而不是用于查找公共元素的集合到集合的操作。没有像myListB.Contains(myListA)
这样的语法来查找公共元素。您可以使用myListB.Intersect(myListA),这将为您提供两个序列共有的另一个项目集合。然后,您可以对其应用Any
,以查看交叉口是否为非空。那么ps.PersonID.Contains(personidwiththis postcode)
是如何工作的呢?如果PersonID是单个项目,并且PersonidWithThisPostCode是一个集合,则该项目不是集合中的项目,如果必须是PersonidWithThisPostCode.Contains(ps.PersonID)
,则不必是集合中的项目吗?
myList.Contains(someId);