【问题标题】:lambda and linq expressionlambda 和 linq 表达式
【发布时间】:2015-01-30 18:00:24
【问题描述】:

我正在开发一个 asp.net mvc 5 应用程序,我正在尝试过滤一个列表,但是当我进行多项选择时,我总是会得到一个糟糕的结果。我使用带有复选框的简单表单来了解选择了哪个任务的标准。

我的数据库:

Table Mission 有一个条件列表(表:CriteriaList)

// public virtual ICollection<Criteria> CriteriaList { get; set; }

int[] CriteriaSelected = List of criteria selected in the form

var items = from i in db.Missions select i;

foreach (var criteriaID in CriteriaSelected)
{
  items = items.Where(m => m.CriteriaList.Any(c => c.CriteriaID == criteriaID ));
}

我知道用于连接多个“where”的“and”运算符可能存在问题,因为我只选择了一个复选框就得到了正确的结果。但我现在有点迷失了做多项选择标准

非常感谢您的帮助

【问题讨论】:

  • 请注意,您的代码与 asp.net mvc 无关。 Mvc 在框架内没有数据访问。您很可能正在使用实体框架。
  • 你是完全正确的,我试图提供更多我能提供帮助的信息,但没有注意到它与 asp.net mvc 无关

标签: c# linq lambda


【解决方案1】:

我会尝试:

var items = db.Missions.Where(m => m.CriteriaList
                                    .Any(c => CriteriaSelected.Contains(c.CriteriaID )));

您应该获得在所选条件中至少找到列表中一个条件的每个任务。

但请注意,由于大量列表搜索,这在记录过多时性能不佳。

【讨论】:

  • 非常感谢 loiti,它成功了,你知道是否还有其他更好的方法来提高性能?
  • @dincan 因为这实际上被 EF 转换为 SQL,我怀疑你需要担心性能。
【解决方案2】:

@loiti 很接近,但删除了他的答案而不是修改它。这是您需要的:

var criteriaSelectedIds = CriteriaSelected.Select(s => s.CriteriaID);
var items = db.Missions.Where(m =>
    m.CriteriaList.Any(c =>
        criteriaSelectedIds.Contains(c.CriteriaID)
    )
);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-06-10
    • 1970-01-01
    相关资源
    最近更新 更多