【问题标题】:Databind ListView datasource and joined tables数据绑定 ListView 数据源和联接表
【发布时间】:2010-08-26 22:54:43
【问题描述】:

我不是 ASP 方面的专家,因此我将不胜感激。与实体固件、ListView 控件、其数据源和类型转换有关的问题。

我有以下 LINQ 查询:

RoutesEntities routesModel = new RoutesEntities();
LocalesEntities localesModel = new LocalesEntities();
ObjectQuery routesQuery = (ObjectQuery) from routes in routesModel.Routes
                                        join locales in localesModel.Locales
                                        on routes.LocaleID equals locales.LocaleID
                                        where locales.IsActive == true
                                        select new {
                                             LocaleID = routes.LocaleID,
                                             RouteName = routes.RouteName
                                        };

AdminTopListView.DataSource = routesQuery;
AdminTopListView.DataBind(); // this line cause the error

如果表没有 JOIN,则一切正常。在所有其他情况下,我得到的错误是只有一个 LINQ 语句有 2 个上下文。

问题是:

  1. ListView 数据源可以接受除 ObjectQuery 之外的哪些类型?
  2. 如何将 LINQ 返回的匿名类型转换为 ObjectQuery?

提前致谢。

【问题讨论】:

    标签: linq listview join datasource


    【解决方案1】:

    碰巧您观察到的错误不是由于数据绑定,而是由于 LINQ。 LINQ 查询是延迟执行的,这意味着它们在绝对必要之前不会真正检索数据。这就解释了为什么您在拨打.DataBind() 之前看不到症状。

    到列表视图的数据绑定语句可以采用多种不同的数据类型。我通常绑定 IList、数组或 DataTable。如果可枚举,您的 LINQ 查询结果将始终适用。

    如果您将数据上下文组合到一个上下文中,则可以执行联接而不会出错。如果该选项不可用,请先将您的集合作为本地列表检索,然后创建 LINQ-to-objects 查询。

    var routesQuery = from routes in routesModel.Routes.ToList()
                      join locales in localesModel.Locales.ToList()
                      on routes.LocaleID equals locales.LocaleID
                      // ...
    

    (注意:如果在加载数据之前对结果集进行预过滤,可以获得更好的性能.ToList())。

    我非常喜欢组合数据上下文的解决方案。

    【讨论】:

    • 你是我的英雄,非常感谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-09-08
    • 2011-01-01
    • 2011-02-07
    • 2011-03-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多