2010-08-26 22 views
2

我不是ASP的专家,所以我将不胜感激的帮助。问题连接到实体FW,ListView控件,其数据源和类型转换。Databind 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 

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

的问题是:

  1. 什么类型除的ObjectQuery可以通过ListView的数据源所接受?
  2. 如何将由LINQ返回的匿名类型转换为ObjectQuery?

在此先感谢。

回答

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()设置可以实现更好的性能)。

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

+0

你是我的英雄,非常感谢你! – artemiusgreat 2010-08-27 17:11:40

+0

很高兴帮助。祝你好运! – kbrimington 2010-08-27 17:39:04