我无法编写语句来返回结果列表,其中连接(包含)表与项集合匹配。
我正在使用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();
}
答案 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)));