Databind ListView数据源和连接表

时间:2010-08-26 22:54:44

标签: linq listview join datasource

我不是ASP的专家,所以我将不胜感激。问题连接到实体FW,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?
  3. 提前致谢。

1 个答案:

答案 0 :(得分:1)

恰好是您观察到的错误不是数据绑定,而是LINQ。 LINQ查询是懒惰执行的,这意味着它们在绝对必要之前不会实际检索数据。这解释了为什么在.DataBind()呼叫之前您没有看到症状。

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

如果将数据上下文合并到一个上下文中,则可以毫无错误地执行连接。如果该选项不可用,请首先将您的集合检索为本地列表,然后创建LINQ到对象查询。

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

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

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