我在使用MVC和LINQ理解某些数据类型和数据集时遇到问题。我正在尝试填充下拉列表。
我收到以下错误(在下面的代码中注明)
"无法创建类型' vps_intranet.Models.Part'的常量值。在此上下文中仅支持原始类型或枚举类型。"
PartsController.cs
private List<Part> partsNotPartOfStructure(int partID)
{
Part mainPart = db.Parts.Find(partID);
//var alreadySelected = db.Parts.Select(p => p.PartStructures_comp).Distinct();
List<Part> parts = new List<Part>();
List<PartStructures> excludeList = db.PartStructures1
.Where(p => p.mainPart_id == partID).ToList();
parts = db.Parts.Where(c => c.PartStructures_comp
.Except((List<PartStructures>) excludeList)).ToList();
//The line above gives the error...
//Unable to create a constant value of type 'vps_intranet.Models.Part'.
//Only primitive types or enumeration types are supported in this context.**
return parts;
}
public async Task<ActionResult> Details(int? id)
{
if (id == null)
{
return new HttpStatusCodeResult(HttpStatusCode.BadRequest);
}
Part part = await db.Parts.FindAsync(id);
if (part == null)
{
return HttpNotFound();
}
ViewData["AvailableParts"] = partsNotPartOfStructure(id.Value);
return View(part);
}
Details.cshtml
@model vps_intranet.Models.Part
@{
var fullList = (IEnumerable< vps_intranet.Models.Part >) ViewData["AvailableParts"];
var availableParts = fullList.Select(p => new SelectListItem { Text = p.partNo.ToString(), Value = p.id });
}
...
@Html.DropDownListFor(model => model.PartStructures_comp, availableParts));
我需要改变什么?
答案 0 :(得分:1)
您正在将PartStructures
类对象列表传递给Except
方法。除了方法使用默认的相等比较器来比较值。
如果要传递自定义类(不是像int
这样的简单值类型),则应实现IEqualityComparer<T>
接口方法,例如Equals
和{ {1}}。
如果您不喜欢这样做,您可以获取PartStructures集合的ID并使用GetHashCode
方法。
Contains
答案 1 :(得分:0)
您正尝试在两种不同的数据类型之间使用Exclude
。您拥有Part
课程,然后是List<PartStructure>
课程。按部分做。首先,获取零件。然后,将其转换为零件结构列表,然后进行排除。
您必须实施IEqualityComparer<T>
取自this帖子。
public class Compare : IEqualityComparer<Part>
{
public bool Equals(Part x, Part y)
{
return x.SomeProperty == y.SomeProperty;
}
public int GetHashCode(Part part)
{
return part.SomeProperty.GetHashCode();
}
}
这样你可以做到
var parts = db.Parts.Exclude(someList, new Compare());