使用具有多对多关系的两个MVC模型中的参数进行搜索

时间:2016-06-30 18:01:40

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

我试图从使用供应商模型中的公司名称和类别模型中的类别名称作为参数的搜索中返回一组供应商实体。客户端可以选择同时使用任一搜索参数,也可以同时使用两者。

我想要做的是设置列表<供应商> ,这是根据供应商公司属性搜索供应商模型,然后再次搜索类别 CategoryName 属性。

供应商和类别模型具有多对多关系。

这些是模型:

public class public class Vendor
{
    public int ID { get; set; }

    [Required]
    public string Company { get; set; }       
    ...
    [Required]
    public virtual ICollection<Category> Categories { get; set; }
}

public class Category
{
    public int CategoryID { get; set; }

    [Required]
    public string CategoryName { get; set; }

    public virtual ICollection<Vendor> Vendors { get; set; }
}

HTML代码为:

@using (Html.BeginForm("Index", "Home", FormMethod.Get))
{    
<div class="row">
    <div class="col-md-10">
        Vendor Name: @Html.TextBox("Search")
    </div>
</div>
    <div class="row">
        <div class="col-md-10">
            Vendor Category: @Html.DropDownList("VendorCategory", "All")
        </div>
    </div>
    <div class="row">
        <div class="col-md-10">
            <input type="submit" value="Search" />
        </div>
    </div>
}

处理搜索的Controller方法部分是:

public ActionResult Index(string Search, int? VendorCategory)
{
    var vendors = from v in db.Vendors select v;

    if(!string.IsNullOrEmpty(Search))
    {
        vendors = vendors.Where(s => s.Company.Contains(Search));
    }

    //Filter the remaining vendors based on the Vendor CategoryName returned from the dropdown list.
    if(VendorCategory != null)
    {   
         //Get the category ID of the Category name selected on the home page Vendor Category dropdown list. 
         int TheCategoryID = VendorCategory.GetValueOrDefault();

         vendors = ???
    }    
}

我遇到了如何创建LINQ查询的最后一个代码行,只返回具有从下拉列表返回的Category name字符串的CategoryID的Vendors。我知道导航属性引用了一组Category对象,我不知道如何编写一个LINQ查询,该查询使所有剩余的供应商都使用具有相关类别ID的Category对象引用。

我是MVC / Entity Framework的新手,并且对LINQ没有广泛的了解(不确定将查询结果分配给TheCategory变量的查询的类别强制转换),所以我理解我可能会这样做这一切都错了。

1 个答案:

答案 0 :(得分:0)

由于Vendor包含Category个集合,因此您的Vendor查询应该非常简单:

var vendors = Vendors.Where(v => v.Categories.Select(c => c.CategoryId)
                                             .Contains(TheCategoryID));

对于每个Vendor v,我们将Categories列表转换为代表所有ID的IEnumerable<int>,然后我们搜索TheCategoryID以查看它是否为{}当下。如果是,则返回true并包含在Where子句中。