Databind ListView источник данных и объединенные таблицы - PullRequest
2 голосов
/ 27 августа 2010

Я не эксперт в ASP, поэтому я был бы признателен за помощь.Проблема связана с Entity 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, все в порядке.Во всех других случаях я получаю сообщение об ошибке говорит, что есть только 2 контекста только для одного оператора LINQ.

Вопросы:

  1. , какие типы, кроме ObjectQuery, могутбыть принятым источником данных ListView?
  2. как преобразовать анонимный тип, возвращаемый LINQ, в ObjectQuery?

Заранее спасибо.

1 Ответ

1 голос
/ 27 августа 2010

Случается, что обнаруженная вами ошибка связана не с привязкой данных, а с 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()).

Я настоятельно предпочитаю решение объединения контекстов данных.

...