【问题标题】:LINQ query to return true if associated (related) record exists for each person如果每个人都存在关联(相关)记录,则 LINQ 查询返回 true
【发布时间】:2012-02-26 21:57:31
【问题描述】:

我有一个 People 对象,其中包含一个相关(关联)的 FavoritePeople 表。 FavoritePeople 对象只存储 UserId 和 PersonId,以便我们知道哪些人是用户的最爱。

我将 Entity Framework 4.2 与 Code First 一起使用,并且我已经映射了 People 中的所有字段,除了 IsFavorite,它是一个布尔值,我的想法是如果 FavoritePeople 中存在相关记录,则将其设置为 true。

我想在 IsFavorite 列中返回所有具有正确值的人员记录。

虽然我可以弄清楚如何在 SQL 中执行此操作,但我仍然坚持如何在 LINQ 中执行此操作!

有什么建议吗?

【问题讨论】:

  • 问题不太清楚 - 什么是“关联记录”?
  • 基本上,关联的意思是如果在 FavoritePeople 表中存在 Person 的记录,则在该 Person 的 People 表中将 IsFavorite 字段设置为 true。

标签: linq entity-framework ef-code-first


【解决方案1】:

如果您有 FavoritePeople 的属性,您也许可以......

public bool IsFavorite {get{return FavoritePeople.Any();}}

【讨论】:

  • 感谢 Tyron,这是一个很好的解决方案,可以根据个人记录来处理它,但我需要为整个收藏集执行此操作。
  • @Mitch - 如果你有一个 People 集合,那么我会遍历集合并为每个集合获取“IsFavorite”值。然后,您可以随心所欲地使用它。您将无法使用单个属性来处理整个集合。
  • @JasCav - 感谢您的评论。也许我对此的整个方法都是错误的。我只是想在人员列表中显示一个复选框,以显示每个人是否在当前用户的收藏夹列表中。我会认为这是一种相当普遍的情况,有一些成熟的方法(使用 LINQ)。
  • 感谢 tyrongower 和 JasCav 的 cmets。我决定采纳他们的建议并在 foreach 循环中使用 FavoritePeople.Any()。不确定这是否是最有效的方法,但它确实有效!这是代码
  • var people = from x in db.People select x; foreach(人中的人) { if (person.FavoritePeople.Any()) person.IsPinned = true; } 返回人;
【解决方案2】:

我没有足够的代表发表评论,所以我会回复一个答案;

如果您选择多人,使用 Tyron 的解决方案会给您带来糟糕的表现。

在查询 People 时,您应该使用 .Include(x => x.FavoritePeople) 急切地加载 FavoritePeople 引用(警告:数据库中可能存在大量数据集)
或者(最好)重写您的查询以包含 IsFavorite:

ctx.Peoples.Select(x => new 
{ 
     x.Name, 
     IsFavorite = x.FavoritePeople.Any()
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多