使用Anon类型属性之一在Anon类型中使用Linq

时间:2012-02-18 22:19:07

标签: c# linq

我试图看看是否可以将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在当前上下文中不存在。

2 个答案:

答案 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中没有针对特定人员的条目会发生什么。根据上述查询,最终结果中仍会返回此类人员PlaceIDPlaceName null

C#允许intint?之间的相等比较;如果后者为null,则比较将始终评估为false。因此,当placeIDnull时,places中的任何条目都不会满足_places.Id == placeID条件(假设Id字段不可为空),并且{{1 }}也会评估为placeName

如果您不想在最终结果中使用此类人员,可以通过添加null条款来修改您的查询:

where