Может ли ExecuteQuery возвращать сгенерированный DBML класс без необходимости извлечения всей информации для этого класса? - PullRequest
0 голосов
/ 02 июля 2010

У меня есть пара классов, сгенерированных DBML, которые связаны между собой идентификатором, например,

ClassA {
    AID,
    XID,
    Name
}

ClassB {
    AID,
    ExtraInfo,
    ExtraInfo2
}

При использовании чего-то вроде db.ClassAs.Where(XID == x) и повторении этого результата в конечном итоге выполняется запрос для каждогоClassAs и каждого из ClassBs, что является медленным.

В качестве альтернативы, я попытался использовать ExecuteQuery, чтобы получить всю информацию, которая мне нужна, и получить эту ClassA.Итерируя по этому вопросу, я получаю то же самое, т. Е. Делаю много отдельных выборок, а не только 1. Если я храню его в ClassC (который не связан с сущностью БД), который имеет поля интереса обоих ClassAи ClassB, этот запрос намного быстрее, но это раздражает, потому что я только что создал IMO ненужный ClassC.

Как я все еще могу использовать ClassA, который связан с ClassB, и все еще использовать ExecuteQuery для запуска 1запрос против A * B количество запросов?

1 Ответ

0 голосов
/ 07 июля 2010

Если у вас есть ассоциации, вы не должны использовать функцию ExecuteQuery ().

Вот пример использования некоторого воображаемого контекста Библиотеки книг и анонимных типов для результата:

var results = 
    Books
    .Where(book => book.BookId == 1)
    .Select(book =>
        new
        {
            book.Name,
            AuthorName = book.Author.Name,  //Is a field in an associated table.
            book.Publisher, //Is an associtated table.
        });

РЕДАКТИРОВАТЬ: без типов anon

var results = 
        Books
        .Where(book => book.BookId == 1)
        .Select(book =>
            new BookResult()
            {
                BookName = book.Name,
                AuthorName = book.Author.Name,  //Is a field in an associated table.
                Publisher = book.Publisher, //Is an associtated table.
            });
...