我试图看看是否可以将3个LINQ查询合并为一个。我遇到的问题是我需要一个内部LINQ语句的where子句中的一个Anon属性的值,这似乎不起作用。我也试图内联LINQ语句,但这也不起作用。
以前有人这样做过吗? PlaceName是我遇到麻烦的地方,因为它使用PlaceID。
var Persons = from _person in people select new
{
ID = _person.Id,
Name = _person.Name,
Nationality = _person.Nationality,
Age = _person.Age,
PlaceID = (from _peopleplaces in peoplePlace where _person.Id ==_peopleplaces.PersonId select _peopleplaces.PlaceId).FirstOrDefault(),
PlaceName = (from _places in places where _places.Id == PlaceID select _places.Name).FirstOrDefault()
};
编辑:我遇到的实际问题是PlaceID不能在PlaceName查询中使用,它下面有红色的波形。使用1而不是3语句的原因仅仅是为了我自己,我正在学习LINQ并希望看到我能做什么和不能做什么。我会假设使用一组而不是3个单独的组来填充Persons对象看起来更好。
实际错误是PlaceID在当前上下文中不存在。
答案 0 :(得分:3)
在计算之前你不能使用PlaceId,即。当它被列举时。
没有什么可以阻止你在单个表达式中查询三个对象,例如
var people = from p in Persons
from ppl in PersonPlaces
From pl in Places
where p.Id == ppl.PersonId
&& ppl.PlaceId == pl.Id
select new { Name=p.Name, PlaceName=pl.Name}
很抱歉格式化,在iPad上很难。
Hth
萨姆
答案 1 :(得分:0)
也许您正在寻找let
关键字?
var Persons =
from _person in people
let placeID =
(
from _peopleplaces in peoplePlace
where _person.Id == _peopleplaces.PersonId
select _peopleplaces.PlaceId
).FirstOrDefault()
let placeName =
(
from _places in places
where _places.Id == placeID
select _places.Name
).FirstOrDefault()
select new
{
ID = _person.Id,
Name = _person.Name,
Nationality = _person.Nationality,
Age = _person.Age,
PlaceID = placeID,
PlaceName = placeName,
};
编辑:正如下面正确提到的@sambomartin,您需要考虑如果peoplePlace
中没有针对特定人员的条目会发生什么。根据上述查询,最终结果中仍会返回此类人员PlaceID
和PlaceName
null
。
C#允许int
和int?
之间的相等比较;如果后者为null
,则比较将始终评估为false
。因此,当placeID
为null
时,places
中的任何条目都不会满足_places.Id == placeID
条件(假设Id
字段不可为空),并且{{1 }}也会评估为placeName
。
如果您不想在最终结果中使用此类人员,可以通过添加null
条款来修改您的查询:
where