Дождитесь завершения DomainContext.Load <t>из сущностного запроса с объединениями (возвращая новый тип через «выберите новый») - PullRequest
0 голосов
/ 01 ноября 2011

Мое приложение объединяет данные из других баз данных для целей отчетности. Мы не можем связать базы данных, поэтому вся обработка данных должна выполняться в коде - это хорошо, так как мы хотим разрешить ручную проверку во время импорта.

Некоторые пользователи смогут запускать обновление через интерфейс Silverlight 4.

У меня есть 3 таблицы в базе данных x, которые питаются от одной модели EF4 (ModelX). Я хочу объединить эти таблицы вместе, выбрать конкретные столбцы и вернуть результат в виде новой сущности, существующей в другой модели EF4 (ModelY). Я использую этот запрос:

var myQuery = from i in DBx.table1 from it in DBx.table2 from h in DBx.table3 where (i.id==it.id && h.otherid == i.otherid) select new ModelYServer {Name = i.name,Thing = it.thing, Stuff = h.stuff};

Я застрял в том, как выполнить этот запрос и дождаться завершения асинхронного вызова. Обычно я бы использовал:

DomainContext.Load<T>(myQuery).Completed += (sender,args) =>
{List<T> myList = ((LoadOperation<T>)sender.Entities.ToList();};

но я не могу передать myQuery (IEnumerable) в DomainContext.Load (), поскольку это ожидает EntityQuery. Набор данных очень большой, и для его возврата может потребоваться до 30 секунд, поэтому мне определенно нужно подождать, прежде чем продолжить.

Так может кто-нибудь сказать мне, как я могу дождаться завершения запроса IEnumerable, или предложить лучший способ сделать это (очень вероятно, что он есть).

Спасибо

Мик

1 Ответ

1 голос
/ 01 ноября 2011

Один простой способ - просто заставить его выполнить оценку, вызвав ToList:

var query = from i in DBx.table1
            join it in DBx.table2 on i.id equals it.id
            join h in DBx.table3 on i.otherid equals h.otherid
            select new ModelYServer {
                Name = i.name,
                Thing = it.thing,
                Stuff = h.stuff
            };
// This will block until the results have been fetched
var results = query.ToList();

// Now use results...

(я изменил ваше предложение where на объединения в более ранних таблицах, как вы это и сделалиэффективно делать, и это более идиоматично, ИМО.)

...