在选择列表中使用视图模型时Linq to Entities错误

时间:2011-10-05 01:00:57

标签: c# .net linq linq-to-entities

我试图通过将一大堆模型实体包装在各个视图模型实体中来创建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)。如果我删除它,它工作正常。对于为什么不允许的任何想法?

1 个答案:

答案 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");

这样排序将在数据库中完成,它比在内存中进行排序更有效。

因此,第二种选择是首选。