LINQ to SQL - пользовательский объект со свойством List <T> - PullRequest
2 голосов
/ 11 марта 2010

Я пытаюсь сделать следующее:

У меня есть пользовательский объект OTest и OSubTest:

public class OTest
{
   public int TestId {get; set;}
   public List<OSubTest> SubTests {get; set;}
}

public class OSubTest
{
   public int SubTestId {get; set;}
}

Теперь я выполню запрос LINQ to SQL, который будет выглядеть следующим образом:

var query = from t in Tests 
select new OTest
{
   TestId = t.TestId
};

Вопрос в том, как я могу получить «Подтесты» как часть запроса и как свойство списка в моем основном объекте OTest без LINQ, запускающего сотню подзапросов из основного запроса данных.

Если я сделал это так, он будет выполнять запрос для каждой возвращаемой записи, что не очень практично:

var query = from t in Tests 
select new OTest
{
   TestId = t.TestId,
   SubTests = (from st in SubTests where st.TestId = t.TestId select new OSubTest{SubTestId = st.SubTestId}).ToList()
};

Есть какие-нибудь мысли о том, как мне получить свойство List для заполнения одним запросом? Возможно с левыми соединениями?

Любая помощь будет оценена.

Если вам нужны какие-либо разъяснения, пожалуйста, спросите меня.

EDIT

Хорошо, если взглянуть на это, оно работает, когда у меня есть 1 подсписок, но как только я добавляю 2-й, 2-й раз запрашивает базу данных 100 раз. Вот мой точный запрос:

public List<OFile> GetFiles(int fileGroupId)
        {
            var query = (from f in CoreContext.Files
                         join fgf in CoreContext.FileGroupFiles on f.FileId equals fgf.FileId
                         where fgf.FileGroupId == fileGroupId
                         select new OFile
                                    {
                                        ActiveFile = f.ActiveFile,
                                        FileExtension = f.FileType,
                                        FileGuid = f.FileIdentifier,
                                        FileName = f.FileName,
                                        FilePath = f.FilePath,
                                        FileSize = f.FileSize,
                                        FileTitle = f.FileTitle,
                                        RevisionId = f.RevisionId,
                                        ParentFileId = f.ParentFileId,
                                        FileId = f.FileId,
                                        Attributes = f.FileAttributeFiles.Where(id => id.FileId == f.FileId).Select(
                                            id => new OFileAttribute
                                                      {
                                                          FileAttributeId = id.FileAttributeId,
                                                          Value = id.Value
                                                      }).ToList(),
                                        Tags = f.FileTags.Where(id => id.FileId == f.FileId).Select(
                                            id => new OFileTag
                                                      {
                                                          FileTagId = id.FileTagId,
                                                          TagName = id.TagName,
                                                      }).ToList(),


                                    });



            return query.ToList();
        }

Атрибуты будут запрашивать базу данных 100 раз и не будут отображаться как JOIN.

Таблица FileAttributeFiles содержит FK для таблицы атрибутов.

Спасибо

1 Ответ

3 голосов
/ 11 марта 2010

Если я сделал это так, он будет выполнять запрос для каждой возвращаемой записи, что не очень практично

Хм, правда? Ты это пробовал? Я не уверен, что Tests и SubTests должны быть, но, вообще говоря, LINQ to SQL выполняет запросы этой формы:

using (var c = new MyDataContext())
{
    var q = from t in c.Tests
            select new 
                   {
                       TestId = t.TestId,
                       SubTests = from st in t.SubTests 
                                  where st.TestId = t.TestId 
                                  select new 
                                  {
                                      SubTestId = st.SubTestId
                                  }
                    };
}

... в одном запросе. Проектирование на POCO вместо анонимных типов также работает. Я не знаю, меняет ли использование ToList() что-либо, потому что я не использую это лично; это "просто работает" без него.

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