2013-09-20 3 views
1

Я пытаюсь использовать LINQ to SQL для запроса соответствующих данных на основе значений в моем массиве, но у меня проблемы. Я читал эти темы, но я не уверен, если они на самом деле то, что я пытаюсь сделать, и если они, как их реализовать:Как запустить запрос для каждой записи в массиве?

LINQ equivalent of foreach for IEnumerable<T>

Linq style "For Each"

У меня есть массив strings 'lines []', как я могу запустить следующий запрос для каждой записи и сохранить результаты таким образом, чтобы я мог выводить их согласованным образом. Опять вот пример моего массива: Пример: Z1234 Z2345 ZAF38383

//some non working code 
List<string> results = new List<string>(); 

var thisQuery = from c in myContext.SpecificTable 
where c.itemNumber == (foreach (string i in lines)) 
select c; 

foreach (var result in thisQuery) 
{ 
    results.Add(result); 
} 

Создание списка в порядке, а запись в список будет слишком хорошо, я думаю, но я не могу выяснить, как запустить запрос для каждого элемента int he Array?

Каждая запись в моем массиве начинается с Z, а затем будет содержать любое расположение буквенно-цифровых символов, если это имеет значение. Пример: Z3333

Каждая запись в массиве соответствует записи в таблице в моей базе данных «SpecificTable». Я хочу вернуть все, что имеет отношение к этому значению, в этой таблице, поэтому я могу затем вывести спецификацию этих данных.

Пример: Я хочу начать с quering Z1234, и когда Z1234 находится в «SpecificTable» Я хочу, чтобы иметь возможность выводить различные детали, как это:

foreach (var res in thisQuery) 
{ 
    //each result from the query (total of 3 from the example) will now show their Description in a messagebox. 
    MessageBox.Show("Description:" + res.Description.ToString()); 
} 

Используя петлю, я надеюсь, чтобы иметь возможность создавать список всех результатов на основе исходного массива и выводить их соответствующие различные значения, такие как «Описание».

Если этого еще недостаточно, сообщите мне, что я могу предоставить, чтобы быть более ясным.

+2

'foreach (var result this thisQuery) {results.Add (result); } 'можно сократить до' results = thisQuery.ToList(); ' – nothrow

ответ

1

Try:

Этот цикл будет строки в myContext.SpecificTable и создает innerloop, чтобы проверить, есть ли совпадение в пределах линий.

var thisQuery = from c in myContext.SpecificTable 
       from i in lines 
       where c.itemNumber == i 
       select c; 

или это:

Это будет делать то же самое, только второй «итератор» делается внутри содержит.

var thisQuery = from c in myContext.SpecificTable 
       where lines.Contains(c.itemNumber) 
       select c; 

Я думаю, что лучше поставить запрос дб в outerloop, потому что вы не хотите «просмотр таблицы» для каждого элемента в строках.

Таким образом, он будет делать только «tablescan» и попытаться найти соответствие в строках.

Я думаю, что это ускорит, если вы пытаетесь что-то вроде этого:

var linesHashSet = new HashSet<string>(lines); 

var thisQuery = from c in myContext.SpecificTable 
       where linesHashSet.Contains(c.itemNumber) 
       select c; 

Здесь будет использовать во второй итерации в HashSet (индексированный список)


Update:

Можно выполнить итерацию рядов клиентов, например:

var thisQuery = from c in myContext.SpecificTable.ToArray() 
       where lines.Contains(c.itemNumber) 
       select c; 

Но это будет иметь производительность в действии. Я предлагаю вам попробовать средний.

+0

Когда я попробовал свой первый запрос, он возвратил следующую ошибку: Локальная последовательность не может использоваться в реализациях LINQ to SQL операторов запросов, кроме оператора Содержит. Я не знаю, что это значит. Я получил последний пример, по крайней мере, не ошибку, когда использовал строку 'where linesHashSet.ToList(). Содержит .... но мой более поздний вызов для просмотра содержимого thisQuery не дает никаких результатов, которые, как я полагаю, означает мой запрос на самом деле ничего не выбирает? –

+0

'Локальная последовательность не может использоваться в LINQ to SQL-реализациях операторов запросов, кроме оператора Contains. 'Он хочет создать один запрос для всего оператора linq, но он не может перевести' from i в строках' в оператор sql. Я предлагаю вам использовать средний. Можно ли отслеживать, что генерируется SQL-запрос? Я добавлю что-то к своему ответу. –

+0

О пустых результатах, я не знаю, как выглядят данные, поэтому я не могу предсказать результаты. –

1

Не уверен, правильно ли я понял ваш вопрос, но вы хотите присоединиться к записи в SpecificTable с массивом «lines» и вывести результаты в виде списка?

var results = myContext.SpecificTable.Select(c => lines.Contains(c.ItemNumber)).ToList(); 
foreach(var result in results) 
{ 
    Console.WriteLine(string.format("{0}:{1}", "Description", result.Description)); 
} 

Если вам нужны только определенные свойства, вы можете вернуть список анонимных объектов.

var results = myContext.SpecificTable.Where(c => lines.Contains(c.ItemNumber)).Select(c => new {c.ItemNumber, c.Description}).ToList(); 
foreach(var result in results) 
{ 
    Console.WriteLine(string.format("{0}:{1}", "Description", result.Description)); 
} 
+0

Где «результаты» уже помещены в список, разве это не позволяет обрабатывать последний вызов «result.Description»? Попытка этого в моем проекте не распознает result.Description, и мне интересно, если это почему? –

+0

«Результаты» будут иметь тип IEnumerable > Я предполагаю. Самый простой способ выяснить - поставить точку останова и найти возвращаемый тип запроса Select. По сути, если тип отдельных элементов не то, что вы хотите, вы можете извлечь определенные свойства. У объекта SpecificTable есть свойство Description? – tranceporter

Смежные вопросы