Какое выражение LINQ мне нужно для этого, без зацикливания? - PullRequest
0 голосов
/ 18 ноября 2011


У меня есть база данных MSSQL с LINQ to SQL.
У меня есть три стола.
Requests -> id, string name
Results -> id, requestID, int jumps
Places -> id, resultID, int location

Затем, используя вход string, мне нужно получить ICollectable или массив или что-то из Place, которое соответствует следующему:
Каждый Request, имеющий name = input, имеет свой идентификатор. [Вы можете предположить, что только один имеет]
Каждый Result, у которого есть requestID = ID[from above], - принимает его id.
Каждый Place, имеющий resultID= 'id [сверху]' - добавляется в массив для дальнейшей обработки.

Я сделал это, зациклив на всех Results и затем выполнив еще один оператор LINQ, но он чрезвычайно медленный [около 500 мс для одного запроса!]. Могу ли я сделать это быстрее?

Спасибо!

Редактировать: Упс, мне также нужно сгруппировать его по результату. aka Список Списков Мест, в то время как каждый внутренний список содержит один столбец из Result.

Ответы [ 2 ]

3 голосов
/ 18 ноября 2011

Вы можете выполнить объединение таблиц в Linq2Sql, используя ключевое слово join:

var places = from request in Requests 
             join result in Results on request.Id equals result.requestID
             join place in Places on result.Id equals place.ResultId
             where request.name = input
             select place;
2 голосов
/ 18 ноября 2011

Что-то вроде

Requests.Where(r => r.name == input).Results.Places.Select();

Если это слишком медленно, то я ожидаю, что вам нужны некоторые индексы в вашей базе данных.

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

...