Модераторы: gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> строка с any List<string> 
:(
    Опции темы
sinitsa
Дата 25.7.2011, 14:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 22.7.2011

Репутация: нет
Всего: нет



Здравствуйте,

мне необходимо найти записи в таблице, где помимо прочих условий есть следующее:

каждая строка должна содержать одну из строк из списка NeuStartStateTexts 

Код

List<string> NeuStartStateTexts = new List<string>();

NeuStartStateTexts.Add("Ausführungstimeout");
NeuStartStateTexts.Add("Der Job wurde terminiert");
NeuStartStateTexts.Add("Keine gültige Jobumgebung");
NeuStartStateTexts.Add("Der Job wurde terminiert");
NeuStartStateTexts.Add("Benutzeranmeldung fehlschlug");
NeuStartStateTexts.Add("InstallUser Token not available");


мой запрос выглядит так:

Код

 var jobtargetErrorNeuStart = data.jobtargets.Where(jt => jt.guid_job == NavigationController._choosenJobGuid &&
                                                                                     jt.state == ((int)EJobStateFlags.eJobStateFinished + 
                                                                                                         (int)EJobStateFlags.eJobStateFlagError) &&
                                                                                      NeuStartStateTexts.Any(s => jt.statetext.Contains(s)));


выдается ошибка:

"Local sequence cannot be used in LINQ to SQL implementations of query operators except the Contains operator."

Я так понимаю, что это из-за того, что список нельзя в LINQ перебирать.

Помогите мне пожалуйста решить эту проблемму.

Заранее спасибо
PM MAIL   Вверх
jonie
Дата 25.7.2011, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: нет
Всего: 118



NeuStartStateTexts.Contains(jt.statetext) используйте


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
sinitsa
Дата 25.7.2011, 15:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 22.7.2011

Репутация: нет
Всего: нет



Цитата(jonie @ 25.7.2011,  14:31)
NeuStartStateTexts.Contains(jt.statetext) используйте

Спасибо за  ответ, 

я так тоже делала:


Код

var temp1 = from jt in data.jobtargets
                            where jt.guid_job == NavigationController._choosenJobGuid
                            && NeuStartStateTexts.Contains(jt.statetext)
                            select jt;


мне кажется, тут смысл действия другой...тут проверяется содержит ли NeuStartStateTexts текст jt.statetext.
Дело в том, что jt.statetext это длинная строка из LOG файла, а NeuStartStateTexts - содержит строки, которые являются ключевыми словами и мне надо, чтоб ключевое слово содержалось в (jt.statetext).

Я должна получить количество таких строк, те я делаю 

Код


int count = temp1.ToList().Count;




и тут мне выдается ошибка что типы данных текст и текст с оператором "равно" несовместимы...что к чему не понятно

PM MAIL   Вверх
jonie
Дата 25.7.2011, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: нет
Всего: 118





--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
sinitsa
Дата 25.7.2011, 15:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 22.7.2011

Репутация: нет
Всего: нет



Цитата(jonie @ 25.7.2011,  15:16)
http://stackoverflow.com/questions/835790/...ql-like-in-linq
почитайте

Я прочитала, но все равно там нет ответа на мой конкретный вопрос...

Мне же надо узнать не содержится в jt.statetext одно из значений моего списка.

Может надо сделать Join?
PM MAIL   Вверх
sinitsa
Дата 25.7.2011, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 7
Регистрация: 22.7.2011

Репутация: нет
Всего: нет



Я нашла возможность определить содержит ли список одних строк одну из строк другого списка:

Код

 bool temp = listJT.Any(s => NeuStartStateTexts.Any(nst => s.statetext.Contains(nst)));


тут listJT содержит полные строки из LOG, а NeuStartStateTexts содержит ключевые слова, которые должны быть найдены в строках listJT 

но теперь не понятно, почему это не работает с полями таблицы, те то, как я использовала в самом начале темы в вопросе..

В чем разница? 

Очень надеюсь, что кто-нибудь мне объяснит

Заранее спасибо
PM MAIL   Вверх
WarHog
Дата 26.7.2011, 01:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 122
Регистрация: 20.10.2007
Где: Воронеж

Репутация: 1
Всего: 2



Разница в том, что сейчас ты используешь запрос к in-memory коллекции, тогда как в первом случае - запрос к базе. Естественно, что в случае запроса к коллекции ты можешь использовать любые конструкции шарпа.
Вообще, откажись от использования Linq2Sql в данном контексте и заюзай EF - он справится с Contains, вложенным в Any, правда, породив запрос с кучей юнионов. Если отказаться нельзя, в Linq2Sql можно сделать примерно то же самое как-то так:
Код

foreach (var neuStartStateText in NeuStartStateTexts)
{
    string word = neuStartStateText;
    var result = data.jobtargets.Where(jt => jt.statetext.Contains(word));
    if (query == null)
        query = result;
    else
        query = query.Union(result);
}


--------------------
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | LINQ (Language-Integrated Query) | Следующая тема »


 




[ Время генерации скрипта: 0.0770 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.