Проблема с кодом фильтра LINQ, выдающим ошибку - PullRequest
1 голос
/ 14 июля 2009

У меня есть следующий код в моем проекте Services, который пытается получить список постов на основе тега ... точно так же, как у нас в SO (без создания этого вопроса meta.stackoverflow.com со всем уважением ....)

Этот сервисный код создает запрос linq, передает его в хранилище и затем возвращает результат. Ничего сложного. Мой метод LINQ filter не работает со следующей ошибкой: -

Метод 'Boolean Contains (System.String) 'не имеет поддерживается перевод на SQL.

Я не уверен, как мне изменить метод фильтра linq :( Вот код ...

public IPagedList<Post> GetPosts(string tag, int index, int pageSize)
{
    var query = _postRepository.GetPosts()
        .WithMostRecent();

    if (!string.IsNullOrEmpty(tag))
    {
        query = from q in query
                    .WithTag(tag) // <--- HERE'S THE FILTER
                select q;
    }

    return query.ToPagedListOrNull(index, pageSize);
}

и метод Filter ...

public static IQueryable<Post> WithTag(this IQueryable<Post> query,
    string tag)
{
    // 'TagList' (property) is an IList<string>
    return from p in query
           where p.TagList.Contains(tag)
           select p;
}

Есть идеи? Я в растерянности: (

Ответы [ 2 ]

1 голос
/ 14 июля 2009

Попробуйте с Any:

public static IQueryable<Post> WithTag(this IQueryable<Post> query,
    string tag)
{
    // 'TagList' (property) is an IList<string>
    return from p in query
           where p.TagList.Any(t => t == tag)
           select p;
}

.

ОБНОВЛЕНИЕ (от PureKrome)

Еще одно предложение Ахмада (в комментарии ниже). При этом используется метод Contains, поэтому он возвращает все сообщения, содержащие тег «Test», например. Сообщение с тегом 'яичко': -

public static IQueryable<Post> WithTag(this IQueryable<Post> query,
    string tag)
{
    // 'TagList' (property) is an IList<string>
    return from p in query
           where p.TagList.Any(t => t.Contains(tag))
           select p;
}
0 голосов
/ 14 июля 2009

В WithTag попробуйте изменить запрос, чтобы использовать список, а не IList:

return from p in query
       let taglist = p.TagList as List<string>
       where taglist.Contains(tag)
       select p;

Также проверьте этот ответ, который похож на мое предложение: Переполнение стека в LINQ to SQL и ключевое слово Contains

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