在选择列表中使用视图模型时出现实体关联错误

本文关键字:实体 错误 关联 模型 视图 列表 选择 | 更新日期: 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");

这种排序方式将在数据库中完成,这比在内存中进行排序要高效得多。