【问题标题】:LINQ to EF Using a Collection in a Where ClauseLINQ to EF 在 Where 子句中使用集合
【发布时间】:2013-04-17 19:31:50
【问题描述】:

我有一个主 VendorProfile 表和一个包含状态代码和日期戳的 1-many VendorHistory 表。下面的查询仅用于检索每个供应商的最新状态(状态代码和日期)。但是,视图允许用户选择任何状态代码的复选框来过滤视图。所以我需要添加一个匹配任何复选框 StatusSelections 的 where 子句。

Model Diagram

    public IEnumerable<BrowseStatusModel> BrowseByStatus(int[] StatusSelections)
    {
        IQueryable<BrowseStatusModel> query = _db.VendorProfiles
            .Include("VendorStatusHistory")
            .Include("StatusCodes")
            .Select(s => new BrowseStatusModel
            {
                ProfileID = s.ProfileID,
                Name = s.Name,
                CompanyName = s.CompanyName,
                CompanyDBA = s.CompanyDBA,
                DateCreated = s.DateCreated,
                Status = s.VendorStatusHistories.OrderByDescending(o => o.DateCreated).FirstOrDefault().Id,
                StatusDate = s.VendorStatusHistories.OrderByDescending(o => o.DateCreated).FirstOrDefault().DateCreated
            })
            .OrderBy(x => x.ProfileID);

        foreach (int status in StatusSelections)
        {
            query = query.Where(x => x.Status == status);
        }
        return query;
    }

上面的 foreach 循环有效,但不幸的是创建了 AND 条件,其中所有选择都必须为真,而不是 ANY。我想我必须以某种方式使用带有以下内容的 where 子句,但在正确的语法上没有成功。

.AsQueryable().Any();

【问题讨论】:

    标签: asp.net-mvc-4 linq-to-entities entity-framework-5


    【解决方案1】:

    使用 contains 代替那个 foreach 循环

    query = query.Where(x =&gt; StatusSelections.Contains(x.Status))

    【讨论】:

    • 错误 4 'int[]' 不包含 'Contains' 的定义和最佳扩展方法重载 'System.Linq.Queryable.Contains(System.Linq.IQueryable , TSource)' 有一些无效参数
    • 确保您使用 System.Linq;
    • msdn.microsoft.com/en-us/library/bb352880.aspx 要么您没有使用 System.Linq,要么您没有对 System.Core 的引用。您可以从处理数组的链接中查看示例代码。
    • 是的,我还有其他使用包含在页面上工作的用法。这个错误显然没有告诉我们真正的原因。原来 Status 不能是可空类型 int?,这导致了编译器错误。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多