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
LINQ语法-标准的顺序_Linq - Fatal编程技术网

LINQ语法-标准的顺序

LINQ语法-标准的顺序,linq,Linq,我试图理解LINQ语法,但却被卡住了。所以我有这条线,它得到了所有的人的邮政编码,我正在寻找 IQueryable<int> PersonIDsWithThisPostcode = _context.Addresses .Where(pst => pst.Postcode.Contains(p)) .Select(b => b.PersonID); 我希望它是与此类似的东西,在这里,您查看一个容器,然后对照一个子集的值进行检查,看看您想要什么

我试图理解LINQ语法,但却被卡住了。所以我有这条线,它得到了所有的人的邮政编码,我正在寻找

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,不是吗?@Glyn
Contains
方法用于集合到项目的检查,而不是用于查找公共元素的集合到集合的操作。没有像
myListB.Contains(myListA)
这样的语法来查找公共元素。您可以使用myListB.Intersect(myListA),这将为您提供两个序列共有的另一个项目集合。然后,您可以对其应用
Any
,以查看交叉口是否为非空。那么
ps.PersonID.Contains(personidwiththis postcode)
是如何工作的呢?如果PersonID是单个项目,并且PersonidWithThisPostCode是一个集合,则该项目不是集合中的项目,如果必须是
PersonidWithThisPostCode.Contains(ps.PersonID)
,则不必是集合中的项目吗?
myList.Contains(someId);