如何将linq查询的结果转换为List(Of T)

时间:2013-09-17 16:33:55

标签: vb.net linq entity-framework list knockout.js

我在VB MV4项目中使用EntityFrameWork 5。

我有一个从EntityFramework图构建的数据库(模型firt而不是代码优先)

我有一个ViewModel X,包含一个List(ofT)T是我实体上的一个

当我打开我的Web应用程序(在浏览器上)时,我要求控制器给我ViewModel X作为Json对象,我用它来使用Knockout JS Mapping插件填充MVVC(淘汰模型)。

当我要求模型时,我使用类似于下面显示的代码填充它

Public Class DataServiceController
    Inherits System.Web.Mvc.Controller

    <Authorize()> _
    Public Function RetrieveData() As JsonResult

        Dim model As ViewModelX
        model = New ViewModelX

    '=====================================
    ' Resources and Tools
    '=====================================
    Dim fetchedResourceAndToolsQuery = From a In db.ResourceAndTools
                       Where a.ProfileId = profile.ProfileId Select a

    For Each eachRes In fetchedResourceAndToolsQuery
        Dim res As ResourceAndTools = New ResourceAndTools
        res.Name = Trim(eachRes.Name)
        res.URL = Trim(eachRes.URL)
        res.Target = eachRes.Target
        res.ResourceId = eachRes.ResourceId
        model.ResourceAndTools.Add(res)
    Next

    Return Json(model, JsonRequestBehavior.AllowGet)

Everthing很棒!除了......这就是问题

如上所述,ViewModelX包含一个List(of T)T ResourceAndTools

是否有人将fetchedResourceAndToolsQuery(Linq查询的结果)的内容复制(克隆,加载,不确定该术语)到model.ResourceAndTools(List(of T))而不实例化新对象并复制我正在做的属性。

我已经进行了修改(克隆,深度复制,浅层复制等)我最接近解决方案是关于如何深度复制对象的一些解释,但它依赖于序列化,它不起作用,因为并非所有属性实体框架对象是可序列化的。

感谢任何帮助 谢谢

1 个答案:

答案 0 :(得分:3)

喜欢这个吗?

model.ResourceAndTools = (
    From a In db.ResourceAndTools
    Where a.ProfileId = profile.ProfileId
    Select New ResourceAndTools() With { _
        .Name = Trim(a.Name), _
        .URL = Trim(a.URL), _
        .Target = a.Target, _
        .ResourceId = a.ResourceId}).ToList()

根据你的评论,也许你可以做到,

Dim dataList = (
    From a In db.ResourceAndTools
    Where a.ProfileId = profile.ProfileId
    Select New With
    {
        .Name = Trim(a.Name),
        .URL = Trim(a.URL),
        .Target = a.Target,
        .ResourceId = a.ResourceId
    }).ToList()

model.ResourceAndTools = dataList.ConvertAll(Function(data)
        Return New ResourceAndTools() With
        {
            .Name = data.Name,
            .Url = data.Url,
            .Target = data.Target,
            .ResourceId = data.ResourceId
        }
    End Function)