我试图从使用供应商模型中的公司名称和类别模型中的类别名称作为参数的搜索中返回一组供应商实体。客户端可以选择使用其中一个搜索参数,也可以同时使用这两个参数。
我要做的是设置一个List
Vendor和Category模型具有多对多关系。
这些是模型:
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查询的最后一行代码中,仅返回具有从下拉列表返回的类别名称字符串的CategoryID的供应商。我知道导航属性引用了一组类别对象,但我不确定如何编写一个LINQ查询,使所有剩余的供应商都具有所讨论的类别ID的类别对象引用。
我是新的MVC/实体框架,并没有LINQ的广泛知识(不确定对查询分配结果的类别转换的类别变量),所以我明白我可能是去这一切都错了。
由于Vendor
有Category
s的集合,您的Vendor
查询应该非常简单:
var vendors = Vendors.Where(v => v.Categories.Select(c => c.CategoryId)
.Contains(TheCategoryID));
对于每个Vendor v
,我们将Categories
列表转换为代表所有id的IEnumerable<int>
,然后我们搜索TheCategoryID
以查看它是否存在。如果是,则返回true,并由Where
子句包含。