【问题标题】:Efficiency with the Linq Contains method where parameter is an array参数为数组的 Linq Contains 方法的效率
【发布时间】:2013-07-18 05:42:43
【问题描述】:

给定一个看起来像这样的实体:

 public ICollection<UserActivity> Activities { get; set; }
 public ICollection<UserTraining> Training { get; set; }

并希望根据 ID 数组过滤用户,即调用以下方法:

public User[] GetUsers(int[] activityIds, int[] trainingIds)

编写上述方法实现最有效的方法是什么。如果我传入一个非数组整数,那将是微不足道的,但我想知道编写它以避免多次数据库调用的最佳方法。

我正在使用 Linq to Entities。

该操作应返回具有任何活动或培训 ID 的用户,而不是所有用户。

【问题讨论】:

  • 使用 Contains 是我发现的最佳方式。这是以前的一篇文章,很好地涵盖了它:stackoverflow.com/questions/2369022/…
  • @jfrankcarr 谢谢,但 Contains 不包含数组的重载。
  • Contains 有一个 IEnumerable/Array 扩展。 System.Linq 将其引入。
  • 任务是获取所有参与给定活动或培训的用户吗?如果是这样,UserActivityUserTraining 上是否都有 User 属性
  • @DavidColwell 不,这些对象没有返回给用户的属性,因为它是多对多的;操作应该是 OR,而不是 AND

标签: c# performance linq


【解决方案1】:
public User[] GetUsers(int[] activityIds, int[] trainingIds)
{
    return _context.Users
        .Where(u => u.Activities.Any(a => activityIds.Contains(a.Id)) ||
                    u.Training.Any(t => trainingIds.Contains(t.Id)))
        .ToArray();
}

【讨论】:

    猜你喜欢
    • 2017-04-09
    • 2014-08-07
    • 2013-04-14
    • 2012-01-02
    • 1970-01-01
    • 1970-01-01
    • 2014-01-24
    • 1970-01-01
    • 2012-01-14
    相关资源
    最近更新 更多