在选择列表中使用视图模型时出现实体关联错误
本文关键字:实体 错误 关联 模型 视图 列表 选择 | 更新日期: 2023-09-27 18:10:23
我试图通过在单个视图模型实体中包装一大堆模型实体来创建SelectList
。
public class ReferenceDocumentSelectionViewModel
{
public ReferenceDocument Document { get; set; }
public int ID { get { return Document.ID; } }
public String DisplayText
{
get
{
return Document.DocumentNumber +
Document.Version +
Document.Revision +
Document.Sheet;
}
}
}
然后我尝试使用lambda表达式来创建这些对象的列表:
var docs = _db.ReferenceDocuments
.Select(r => new ReferenceDocumentSelectionViewModel()
{
Document = r
});
,然后将它们分配给SelectList
:
ReferenceDocList = new SelectList(docs.OrderBy(r => r.DisplayText),
"ID",
"DisplayText");
在我看来,我像这样访问SelectList:
@Html.DropDownListFor(model => model.SelectedReferenceDoc,
Model.ReferenceDocList,
"-Select-",
new { id = "ReferenceList" })
其中model.SelectedReferenceDoc
是另一个视图模型的整数属性。
我认为这将工作,但相反,我得到以下错误:
在LINQ to中不支持指定的类型成员'DisplayText'实体。只有初始化式、实体成员和实体导航
帮助吗?
编辑:在进一步的调查中,似乎是docs.OrderBy(r => r.DisplayText)
导致了这个问题。如果我把它去掉,它就能正常工作。知道为什么不允许吗?
由于DisplayText
不是映射属性,EF不知道如何将其转换为SQL。这就是为什么它给你一个错误。
您可以在这里使用LINQ-to-Objects排序,首先加载所有元素
var docs = _db.ReferenceDocuments
.Select(r => new ReferenceDocumentSelectionViewModel()
{
Document = r
}).ToList();
然后在内存中排序
ReferenceDocList = new SelectList(docs.OrderBy(r => r.DisplayText),
"ID",
"DisplayText");
或按每个属性排序
var docs = _db.ReferenceDocuments
.OrderBy(r => r.DocumentNumber)
.ThenBy(r => r.Version)
.ThenBy(r => r.Revision)
.ThenBy(r => r.Sheet)
.Select(r => new ReferenceDocumentSelectionViewModel()
{
Document = r
});
ReferenceDocList = new SelectList(docs,
"ID",
"DisplayText");
这种排序方式将在数据库中完成,这比在内存中进行排序要高效得多。