Linq linq-to-entity добавляет соединение, если выполняется условие - PullRequest
1 голос
/ 02 июля 2011

Я довольно новичок в c # и EF, и я не смог найти ответ на следующий вопрос, простите, если бы я пропустил один.

Я хочу присоединиться к запросу "основной запрос" с несколькими«Необязательные запросы», которые идут к разным таблицам в одной и той же модели, как я должен этого достичь?

Если я пытаюсь использовать метод Join (), он работает, пока я делаю это:

var query = query1.Join(query2 [...]);

но при попытке что-то вроде

query = query1;

if (condition_is_met)
{
    query = query.Join(query2 [...]);
}

я получаю сообщение об ошибке

Невозможно неявно преобразовать тип 'System.Linq.IQueryable<AnonymousType#1>' в 'System.Collections.Generic.IEnumerable<someentity>'.Существует явное преобразование (вам не хватает приведения?)

Как можно избежать этой ошибки и / или существует ли способ добавить объединения, если выполняется условие?

Заранее спасибо и извините за (я боюсь, глупый) вопрос.

Ответы [ 2 ]

2 голосов
/ 02 июля 2011

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

Пример работающего см. В

var query = context.Foos.AsQueryable();

if (DateTime.Now.Second % 2 == 0)
{
    query = query.Join(context.Bars, f => f.BarId, b => b.Id, (f, b) => new { f, b }).Select(item => item.f);
}
else 
{
    query = query.OrderByDescending(f => f.Id);
}

Причина, по которой это работает, заключается в том, что первоначальное объявление IQueryable<Foo>, а каждый из результирующих запросов (либо объединенная, либо упорядоченная версия) по-прежнему IQueryable<Foo>.

Если вам необходимо спроецировать результат запросак анонимному типу, я рекомендую сохранить это для более позднего шага (запрос вашего составного запроса).Создайте все свои объединения, свою фильтрацию, свои заказы и т. Д., А затем, наконец, удалите свой анонимный тип.Пока ваш тип одинаков, независимо от другой логики, которую вы включаете, вы сможете использовать свой единственный запрос.

Однако, если логика влияет на форму данных, которые вы на самом деле получаете, тогда вам не повезло, вам нужно будет пойти в другом направлении.

0 голосов
/ 02 июля 2011

Это потому, что результатом Join() является тип, который отличается от типа исходного запроса.Как должен код после условия обрабатывать переменную?Он может содержать один из двух разных типов.Таким образом, сделать это так просто невозможно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...