Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
LINQ查询以查找包含表上集合中的位置_Linq_Asp.net Mvc 4_Entity Framework 5 - Fatal编程技术网

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

LINQ查询以查找包含表上集合中的位置,linq,asp.net-mvc-4,entity-framework-5,Linq,Asp.net Mvc 4,Entity Framework 5,我在编写语句以返回联接(包含)表与项集合匹配的结果列表时遇到问题 我使用的是EF5.0实体模型。我有一个简单的VendorProfile表,其中包含他们选择的VendorCategories的PK/FK表,可以在ProfileID上加入 我不知道如何只获取VendorProfiles中VendorCategories与集合(从表单帖子传递)匹配的结果。我试图构建一个能够处理多个搜索条件的动态搜索功能,除了第一个功能外,其他功能都可以工作,在第一个功能中,我需要在有条件集合的地方过滤结果 publ

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

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

我不知道如何只获取VendorProfiles中VendorCategories与集合(从表单帖子传递)匹配的结果。我试图构建一个能够处理多个搜索条件的动态搜索功能,除了第一个功能外,其他功能都可以工作,在第一个功能中,我需要在有
条件集合的地方过滤结果

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();
    }
公共类CustomSearchCriteria
{
公共字符串名称{get;set;}
公共字符串公司{get;set;}
公共日期时间?开始日期{get;set;}
公共日期时间?结束日期{get;set;}
公共int[]类别{get;set;}
}
公共IEnumerable搜索(CustomSearchCriteria条件)
{
IQueryable查询=_db.VendorProfiles
.包括(“卖方类别”)
.OrderBy(v=>v.ProfileID);
如果(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
请尝试使用执行以下操作,并让我知道其工作原理:

编辑#1:更改查询以匹配变量类型,前提是
条件.categories
包含VendorCategoryId的集合

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

query = query.Where(v => criteria.categories.AsQueryable().Any(cat => v.VendorCategories.Select(vendCat => vendCat.VendorCategoryID).Contains(cat));

过滤的条件是什么?您是否正在寻找
VendorProfile
,其中包含
criteria
指定的所有
VendorCategory
,或至少一个
VendorCategory
指定的
criteria
,基于代码段和上述措辞,我想说OP的目的是找到一个具有所有指定条件类别的
VendorProfile
。语法不正确(best重载有一些无效参数),但要进一步研究此选项。Thx已编辑以修复该问题。Thx。此查询确实有效,但正在执行&&操作,而不是| |操作。这意味着,如果我选中多个类别,我只会得到匹配所有选择的供应商,而不会得到匹配任何选择的供应商。这可能行得通,但我想知道如何让它走另一条路。有可能吗?又是Thx!我希望这能帮助其他人解决类似的问题。新问题这只返回那些供应商类别包含在标准列表中的供应商。如果criteria.categories中有任何额外内容,则不会筛选出此配置文件记录。因此,如果任何供应商类别被列为criteria.categories中的任何一个,您是否希望找到匹配项?如果是这样,您可以将“VendorCategories.All”改为“VendorCategories.Any”否。我假设OP试图获取所有VendorProfile记录,其中
条件.categories
数组的每个元素都在该记录的VendorCategories集合中找到。@IronMan84您的解决方案非常有用,我甚至包括了一个单选按钮选项,这样用户就可以搜索匹配的所有或任何。我希望你们能对下一个挑战发表意见,让所有表单值在回发后保持其价值。
// assumes v.VendorCategories is int[]
if (criteria.categories != null && criteria.categories.Any())
    query = query.Where(v => v.VendorCategories.All(id => criteria.categories.Contains(id)));