我试图通过将一大堆模型实体包装在各个视图模型实体中来创建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)
。如果我删除它,它工作正常。对于为什么不允许的任何想法?
答案 0 :(得分:3)
由于DisplayText
不是映射属性,因此EF不知道如何将其转换为SQL。这就是为什么它会给你一个错误。
您可以通过首先加载所有元素
来使用LINQ到对象排序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");
这样排序将在数据库中完成,它比在内存中进行排序更有效。
因此,第二种选择是首选。