LINQ查询变量传递给另一个LINQ查询

时间:2017-10-18 08:24:43

标签: linq

这篇文章中的查询有什么区别: Save LINQ Query As Variable To Call Another LINQ Query

var parentLoc = (from a in db.PartsLocations
                where a.LocationName == aContainer
                select a.ParentLocation);

var locations = (from b in db.PartsLocations
                where b.LocationID == parentLoc
                select b).ToList(); 

来自this帖子的以下示例。

Dim persVogel = From p In db.People
                Where p.LastName = "Vogel"
                Select p

Dim persVogelPHVIS = From pp In persVogel
                     Where pp.Company.Name = "PHVIS"
                     Select pp 

这两个都声明了2个查询,并将第一个查询变量用于第二个查询。 在第一个例子中使用Single()但是在visualstudiomagazine.com文章中没有使用的原因是什么?感谢

1 个答案:

答案 0 :(得分:0)

这两个样本根本不同。

第一个样本

我认为你错误地粘贴了这个......从引用的问题来看,查询应该是:

var parentLoc = (from a in db.PartsLocations
                 where a.LocationName == aContainer
                 select a.ParentLocation).Single();

var locations = (from b in db.PartsLocations
                 where b.LocationID == parentLoc
                 select b).ToList(); 

(我假设LocationIDParentLocation被输入为int。)

在此示例中,parentLocint - 从ParentLocation表获取的PartsLocations值的单个实例。所以你得到的是int

第二个linq语句也从PartsLocations表中获取其记录。它使用parentLoc来标识该表中的记录(例如where b.LocationID == parentLoc)。最后得到的是一组PartsLocations条记录。

进行.Single()调用是因为您希望将结果与第二个语句中的LocationID进行比较,并且无法将intIEnumerable<int>进行比较。

第二个样本

Dim persVogel = From p In db.People
                Where p.LastName = "Vogel"
                Select p

Dim persVogelPHVIS = From pp In persVogel
                     Where pp.Company.Name = "PHVIS"
                     Select pp 

在第二个示例中,persVogel是来自People表的记录的子集(具体地,是具有LastName == "Vogel"的人的子集) - 所以你得到的是一组{ {1}}记录。

第二个linq语句基于此记录子集(People),并进一步将其过滤到From pp In persVogel所在的记录。你得到的仍然是一组pp.Company.Name = "PHVIS"条记录。

这两个语句很容易压缩成一个语句:

People

最后,您仍会获得一组Dim persVogelPHVIS = From p In db.People Where p.LastName = "Vogel" AndAlso p.Company.Name = "PHVIS" Select p 条记录。