【问题标题】:Querying Child Collections in LINQ在 LINQ 中查询子集合
【发布时间】:2009-02-06 18:30:37
【问题描述】:

我有一个名为 Gigs 的对象集合。

每个Gig 都有一个Acts 集合。

使用 Linq,我想查询我的演出集合,以获取所有演出,例如,id 为 7 的行为。

act.id = 7;

所以我开始写...

return from gig in qry
       where gig.Acts //not sure how to do this bit
       select gig;

但我不确定您是如何为名为acts 的子集合设置条件的。

有什么想法吗?

【问题讨论】:

    标签: c# .net linq


    【解决方案1】:

    与 Mike_G 基本相同,只是语法更冗长并使用相等性。

    var myCollection = from gig in qry
                       where gig.Acts.Any(act => act.ID == 7)
                       select gig;
    

    只是一个编辑,让 cmets 得到答案:

    实际上查询的是Act对象上成员(艺术家)的ID,可以为空。

    新查询:

    var myCollection = from gig in qry
                       where gig.Acts.Any(act => (null != act.Artist) && (act.Artist.ID == 7))
                       select gig;
    

    【讨论】:

    • 你的其实有点偏,因为 Acts 本身就是一个集合,没有 ID 属性。
    • 是的,我意识到在我写完之后.. Derp,只是要去编辑。
    • 我完全忘记了任何!我想知道在列出的所有查询中,哪个是最快的。
    • 尝试此操作时出现此错误:“Shared.DO.Act”的成员访问“Shared.DO.Artist Artist”在“System.Collections.Generic.List`1”类型上不合法[ Shared.DO.Act] Acts 是一个列表 有什么想法吗?
    • 注意...我的实际要求是:from gig in qry where gig.Acts.Any(act => act.Artist.ID == 7) select gig;艺术家可以为空!我该如何解释这一点??
    【解决方案2】:
    var x = gigs.Where(g=>g.Acts.Select(a=>a.ID).Contains(7));
    

    这两个查询也返回相同的结果:

    var x = gigs.Where(g=>g.Acts.Count(a=>a.ID == 7) > 0);
    
    var x = gigs.Where(g=>g.Acts.FirstOrDefault(a=>a.ID == 7) != null);
    

    【讨论】:

    • Linq 真的很奇怪,因为有几种方法可以编写相同的查询。
    • 所以完整的请求是.... var x = gigs.Where(g=>g.Acts.Select(a=>a.Artist.ID).Contains(7));如果 Artists 为空(这是完全有效的),我会得到一个例外......“Shared.DO.Act”的“Shared.DO.Artist Artist”在类型“System.Collections.Generic.List`1[Shared. DO.Act] 嗯的想法?
    • 修改一下也是先看艺术家,再查ID: var x = gigs.Where(g=>g.Acts.Select(a=>a.Artist).Select(b =>b.ID).Contains(7));或
    • var x = gigs.Where(g=>g.Acts.Count(a=>a.Artist!=null && a.Artist.ID == 7) > 0);
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-10-05
    • 2011-12-16
    • 1970-01-01
    • 1970-01-01
    • 2012-08-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多