У меня есть следующий Linq2Sql, и он выполняет более одного обхода для моего оператора SELECT. Я не уверен почему. Сначала код, затем объяснение: -
from p in db.Questions
select new Models.Question
{
Title = p.Title,
TagList = (from t in p.QuestionTags
select t.Tag.Name).ToList()
}
Теперь база данных
Вопросы <-одно ко многим-> Вопросы-теги <-мани к одному-> Метка
поэтому один вопрос имеет один ко многим тегам с таблицей ссылок в середине. Таким образом, я могу повторно использовать теги несколько раз. (Я открыт для лучшей схемы, если она есть).
При этом выполняется следующий код Sql, сгенерированный Linq2Sql
SELECT [t0].[QuestionId] AS [ID], etc.... <-- that's the good one
.
exec sp_executesql N'SELECT [t1].[Name]
FROM [dbo].[QuestionTags] AS [t0]
INNER JOIN [dbo].[Tags] AS [t1] ON [t1].[TagId] = [t0].[TagId]
WHERE [t0].[QuestionId] = @x1',N'@x1 int',@x1=1
Второй блок SQL указан в списке 2x .. Я думаю, это потому, что первый блок SQL возвращает два результата, поэтому второй запускается для каждого результата из первого.
Можно ли как-нибудь сделать этот оператор SQL вместо 1 + n, где n = количество результатов первого запроса?
Обновление:
Я пробовал загружать Eager и Lazy, и нет никакой разницы.
DataLoadOptions dataLoadOptions = new DataLoadOptions();
dataLoadOptions.LoadWith<Question>(x => x.QuestionTags);
dataLoadOptions.LoadWith<QuestionTag>(x => x.Tag);
db.LoadOptions = dataLoadOptions;