Присоединиться с помощью Linq не удалось с Entity Framework 4.0 - PullRequest
0 голосов
/ 15 ноября 2011

У меня проблемы с запуском запроса linq для соединения с EF 4.0. Ниже приведен код, лишенный всех ненужных утверждений, все еще воспроизводящих ошибку)

using (var threadRepo = new Repo<Thread>())
using (var postRepo = new Repo<Post>())
{
    var query = threadRepo
                    .Join(postRepo, t => t.PostId, s => s.Id, (t, s) => 1);

    var array = query.ToArray();
}

Repo - моя реализация шаблона репозитория, и метод соединения выглядит так:

public IEnumerable<TResult> Join<TInner, TKey, TResult>(
        IEnumerable<TInner> inner,
        Expression<Func<TEntity, TKey>> outerSelector, 
        Expression<Func<TInner, TKey>> innerSelector, 
        Expression<Func<TEntity, TInner, TResult>> result)
{
    return _objectSet.Join(inner, outerSelector, innerSelector, result);
}

Я получаю ошибку

Unable to create a constant value of type 'Post'. 
Only primitive types ('such as Int32, String, and Guid') 
are supported in this context.

Тот же запрос работает в LinqPad для той же базы данных (хотя, конечно, там нет EF 4.0)

from t in Thread
join p in Post on t.PostId equals p.Id
select 1

Есть какие-нибудь подсказки, почему Linq дает мне это исключение?

Обновление

Исходя из предложенного ниже предложения, я попытался использовать общий текст данных для обоих репозиториев, используя единицу работы. Однако, похоже, это не решает проблему. Ниже приведен код, который я использовал

using (var uow = new UnitOfWork<CommunicationEntities>())
{
    using (var threadRepo = new Repo<Thread>(uow))
    using (var postRepo = new Repo<Post>(uow))
    {
        var query = threadRepo
                        .Join(postRepo, t => t.PostId, s => s.Id, (t, s) => 1);

        var array = query.ToArray();
    }
}

Это дает мне ту же ошибку, что и раньше.

Спасибо Jaspreet

1 Ответ

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

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

...