EF- Как сделать 'Not In', используя Linq to Entities - PullRequest
3 голосов
/ 26 января 2010

Я использую Entity Framework 3.5 и у меня возникают проблемы при выполнении этого запроса.

У меня есть следующие объекты: Кандидат, заявка и applicationstatusHistory (отслеживание соискателей)

Я ищу совпадения в Приложении , где не найдено совпадений applicationids в applicationstatusHistory с идентификатором -insert param Вот-. 2 объекта объединены applicationid.

Вот мое текущее заявление:

 applications = context.Application.Include("Applicant").Include("ApplicationStatusHistory")
                        .Where(LinqExtension.BuildContainsExpression<Application, int>(a => a.Id, applicationIds))
                        .ToList();

1 Ответ

3 голосов
/ 26 января 2010

Не уверен, что происходит в BuildContainsExpression, но вот метод WhereNotIn, который я нашел где-то и использовал:

public static IQueryable<T> WhereNotIn<T, TValue>(
    this IQueryable<T> query,
    Expression<Func<T, TValue>> propertySelector,
    IEnumerable<TValue> values)
{
    if (propertySelector == null)
    {
        throw new ArgumentNullException("propertySelector");
    }

    if (values == null || !values.Any())
    {
        return query.Where(i => true);
    }

    var param = propertySelector.Parameters.Single();
    var unequals = values.Select(value => (Expression)Expression.NotEqual(propertySelector.Body, Expression.Constant(value, typeof(TValue))));
    var body = unequals.Aggregate<Expression>((accumulate, unequal) => Expression.And(accumulate, unequal));
    var lambda = Expression.Lambda<Func<T, bool>>(body, param);

    return query.Where(lambda);
}

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

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