LINQ查询以查找包含在表中的集合的位置

时间:2013-01-07 18:56:31

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

我无法编写语句来返回结果列表,其中连接(包含)表与项集合匹配。

我正在使用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();
    }

2 个答案:

答案 0 :(得分: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));

答案 1 :(得分: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)));