主/细节:使用IEnumerable和IQueryable进行转换和绑定

时间:2014-09-10 07:10:14

标签: asp.net-mvc linq entity-framework asp.net-mvc-4 linq-to-entities

我有以下主/细节场景,通过linq查询填充:

    Public Class MasterDto
        Public Property ANYMASTERVALUE1 As String
        Public Property DETAILDTO() As IEnumerable(Of DetailDto)
    End Class

    Public Class DetailDto
        Public Property ANYDETAILVALUE1 As String
        Public Property ANYDETAILVALUE2 As String
    End Class

    Dim query = From a In db.TABLE1
                Select New MasterDto With {
                  .ANYMASTERVALUE1 = a.ANYMASTERVALUE1,
                  .DETAILDTO = From b In db.TABLE2
                               Where a.ID = b.ID
                               Select New MasterDto With {
                                 .ANYDETAILVALUE1 = b.ANYDETAILVALUE1,
                                 .ANYDETAILVALUE2 = b.ANYDETAILVALUE2
                                }
                }

第一个问题

当查询多个记录然后尝试调用query = query.toList时,我收到以下错误:

无法将类型'System.Linq.IQueryable'1'强制转换为'System.Collections.Generic.IEnumerable'1'。 LINQ to Entities仅支持转换EDM原语或枚举类型。

但是,当我将Public Property DETAILDTO() As IEnumerable(Of DetailDto)更改为Public Property DETAILDTO() As IQueryable(Of DetailDto)时,一切正常。

有没有办法使用IEnumerable(Of ...),因为如果我不能使用它,我会遇到第二个错误。

第二个问题

我可以使用IQueryable,但是我遇到了第二个问题。 我扩展查询以获取单个记录Where a.ID = 123,然后使用视图显示主数据,并使用Html.EditorFor模板获取详细数据,如下所示:

查看

@ModelType MvcApp.MasterDto
@Using Html.BeginForm()
    @Html.ValidationSummary(True)
        @Html.DisplayFor(Function(model) model.ANYMASTERVALUE1)
        @Html.EditorFor(Function(model) model.DETAILDTO)
        <input type="submit" value="Save" />
End Using

EditorFor

@ModelType MvcApp.PostMedienDto
    @Html.DisplayFor(Function(model) model.ANYDETAILVALUE1)
    @Html.DisplayFor(Function(model) model.ANYDETAILVALUE2)

在我使用Master DTO中的Public Property DETAILDTO() As IEnumerable(Of DetailDto)时,在HttpPost(点击保存按钮)上我得到以下异常:

System.MissingMethodException:无法创建接口的实例。

当我使用Public Property DETAILDTO() As IEnumerable(Of DetailDto)模型(主数据和详细数据)正确绑定并返回到控制器时。

我希望你看到我的困境并找到解决方案吗?

0 个答案:

没有答案