LINQ: Помощь с запросом linq и содержит для IEnumerable <string>? - PullRequest
1 голос
/ 09 ноября 2009

Кто-нибудь может помочь?

У меня есть запрос linq, который встроен в метод расширения, он работал, так как v.RentalStatus был строкой. Сейчас я использую группу в исходном запросе (запрос довольно сложный, поэтому я не буду помещать его здесь).

Важным моментом является то, что v.RentalStatus = IEnumerable, следовательно, он может содержать такие вещи, как

A (meaning active)
R (meaning rented)
U (unavailable)

etc - many more

Я создаю список того, что я хотел бы вернуть, и сохраняю это в statusStringList, поэтому, например, скажем, список содержит A и R

Это мой код, когда v.RentalStatus был просто строкой, может кто-нибудь сказать мне, как я могу изменить это для работы.

        var statusStringList = rentalStatus.ToList().ConvertAll<string>(st => st.GetStringValue());

        return from v in qry
               where statusStringList.Contains(v.RentalStatus)
               select v;

Если это поможет, это часть моего запроса, которая возвращает RentalStatus - его часть группового запроса, но RentalStatus не входит в группу по

 RentalStatus= g1.Select( j => j.IdRentalStatus).Distinct(),

g1 - моя группа, поэтому, если вы представите, что есть 10 "A", 5 "U" ... тогда он вернет неисчислимое количество A и U ... так как я использую Distinct. Не 10 Как и 5 Ус

Надеюсь, я все хорошо объяснил, пожалуйста, скажите мне, если нет

Буду признателен за любую помощь.

спасибо

EDIT

Это моя дополнительная подпись, но это не так важно.

    public static IQueryable<Rentals> WithStatus(this IQueryable<Rentals> qry, IList<Contants.Statuses> rentalStatus)
    {

EDIT

Как упоминалось ранее, когда v.RentalStatus была строкой, она работала, но теперь ее IEnumerable - следовательно, коллекция .. и она ошибается с этим

  Argument '1': cannot convert from 'System.Collections.Generic.IEnumerable<string>' to 'string'

Ответы [ 4 ]

2 голосов
/ 09 ноября 2009

Если RentalStatus изменился со строки на IEnumberable, то ваш список сравнения 2 ... Я думаю, что это должно работать:

return from v in qry
    where v.RentalStatus.Any(status => statusStringList.Contains(status))
    select v;

Это должно дать вам любую аренду, которая имеет статус, который находится в списке, который вы предоставляете

Edit:

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

Обширный анализ LINQ: лямбда-выражения и анонимные типы

.NET лямбда-выражения - Ресурсы

"ГДЕ" RentalStatus = Содержит любой само по себе - arrgghh -

Это правда? Я думал, что список rentalStatuses является параметром в вашем методе. Я думал, что ваш запрос в основном позволит мне получить все прокаты, которые имеют статус, который соответствует любому из списка, который я указал. Один список живет на вашем объекте Rental, а другой - тот, который я передаю ...

Относительно того, почему порядок в моем работал. У меня есть несколько вопросов:

Вы используете это для запроса базы данных? Вы можете посмотреть на tsql, который он генерирует?

Если это так, я бы посмотрел на tsql и увидел, в чем разница. Я должен был бы проверить себя. Мне повезло, я думаю.

1 голос
/ 09 ноября 2009

Вы можете попробовать что-то вроде этого:

where statusStringList.Any(x => v.RentalStatus.Contains(x))
0 голосов
/ 09 ноября 2009

Попробуйте это:

    return from v in qry
           where rentalStatus.Any( r => r.IdRentalStatus == v.RentalStatus)
           select v;
0 голосов
/ 09 ноября 2009

Я не уверен, но думаю, что для Contains для работы в Linq to SQL это должен быть массив строк (или целых или ...), а не какой-либо IEnumerable Я бы таким образом попробовал:

var statusStringArray = rentalStatus.ToList().ConvertAll<string>(st => st.GetStringValue()).ToArray();

return from v in qry
       where statusStringArray.Contains(v.RentalStatus)
       select v;

Могут быть и другие проблемы, я не особо выгляжу.

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