0

我在编写语句以返回连接(包含)表与项目集合匹配的结果列表时遇到问题。

我正在使用 EF 5.0 实体模型。我有一个简单VendorProfile的表,其中包含VendorCategories他们选择的可以加入的 PK/FK 表ProfileID

我无法弄清楚如何仅在 VendorProfiles 具有与集合匹配的 VendorCategories (从表单帖子中传递)的位置返回结果。我试图构建一个可以处理多个搜索条件的动态搜索功能,除了第一个我需要过滤结果的地方之外,所有搜索条件都有效criteria.categories

public class CustomSearchCriteria
{
    public string name { get; set; }
    public string company { get; set; }
    public DateTime? startDate { get; set; }
    public DateTime? endDate { get; set; }
    public int[] categories { get; set; }
}

public IEnumerable<VendorProfile> Search(CustomSearchCriteria criteria)
{
    IQueryable<VendorProfile> query = _db.VendorProfiles
        .Include("VendorCategories")
        .OrderBy(v => v.ProfileID);

    if (criteria.categories != null)
        query = query.Where(v => v.VendorCategories.Contains(criteria.categories));

    if (criteria.name != string.Empty)
        query = query.Where(v => v.Name.Contains(criteria.name));

    if (criteria.company != string.Empty)
        query = query.Where(v => v.CompanyName.Contains(criteria.company));

    if (criteria.startDate != null && criteria.endDate != null)
        query = query.Where(v => v.DateCreated > criteria.startDate && v.DateCreated < criteria.endDate);

        return query.ToList();
    }
4

2 回答 2

2

尝试使用Queryable.All()执行以下操作,并告诉我它是如何工作的:

编辑#1:更改查询以匹配变量类型,假设criteria.categories包含 VendorCategoryID 的集合。

编辑#2:根据评论将查询更改为使用 Any() 而不是 All()

query = query.Where(v => criteria.categories.AsQueryable().Any(cat => v.VendorCategories.Select(vendCat => vendCat.VendorCategoryID).Contains(cat));
于 2013-01-07T19:05:58.977 回答
0
// assumes v.VendorCategories is int[]
if (criteria.categories != null && criteria.categories.Any())
    query = query.Where(v => v.VendorCategories.All(id => criteria.categories.Contains(id)));
于 2013-01-07T21:45:15.093 回答