Могу ли я выполнить запрос LINQ to SQL из объекта LINQ? - PullRequest
0 голосов
/ 30 июля 2009

В настоящее время у меня есть запрос LINQ, реализованный как метод моего класса DataContext. Этот метод вычисляет разрешения, которые пользователь имеет для страницы в Wiki / CMS. Я хотел бы переместить этот метод в объекты данных Page и User LINQ.

Однако, когда я перемещаю этот запрос к отдельным объектам данных, он выполняется с использованием LINQ to Objects вместо LINQ to SQL. Это означает, что при каждом запуске он получает несколько полных коллекций с сервера базы данных.

Вот фрагмент кода, который использует LINQ to Objects. Я бы хотел использовать LINQ to SQL:

partial class WikiPage
{
    public void GetUserPermissions(Guid? userId) {
        var usersPlusAnon =
            (
                from user in this.Wiki.WikiWikiUsers
                select new { user.WikiId, WikiUserId = (Guid?)user.WikiUserId }
            ).Union(
                from wiki in new Wiki[]{this.Wiki}
                select new { wiki.WikiId, WikiUserId = (Guid?)null }
            );
    }
}

Вот фрагмент кода, который работает с использованием LINQ to SQL. Я предпочел бы иметь этот метод в классе WikiPage, чем в DataContext:

partial class WikiDataContext
{
    public void GetUserPermissions(Guid? userId) {
        var usersPlusAnon =
            (
                from user in this.WikiTomeUsers
                join wikiUser in this.WikiWikiTomeUsers on user.WikiTomeUserId equals wikiUser.WikiTomeUserId into tmp_wikiUser
                from wikiUser in tmp_wikiUser.DefaultIfEmpty()
                select new { WikiId = wikiUser.WikiId, WikiTomeUserId = (Guid?)wikiUser.WikiTomeUserId }
            )
            .Union(
                from wiki in this.Wikis
                select new { WikiId = wiki.WikiId, WikiTomeUserId = (Guid?)null }
            );
    }
}

Когда запрос LINQ запускается из DataContext, он выполняется как LINQ to SQL, но при запуске из объекта LINQ WikiPage он выполняется как LINQ to Objects. Что-то не так с моим синтаксисом здесь, или это просто невозможно с LINQ?

1 Ответ

1 голос
/ 30 июля 2009

Причина, по которой вы получаете разные варианты поведения в обоих наборах кода, заключается в том, что вы используете ключевое слово this.

Когда вы пишете свой код как часть контекста данных, он использует классы LINQ to SQL в объекте DataContext (поскольку ключевое слово this указывает на DataContext).

Если вы хотите, чтобы код вне DataContext использовал LINQ to SQL, вы должны изменить ссылку на this на экземпляр вашего WikiDataContext. Затем следует использовать LINQ to SQL для извлечения ваших данных из базы данных, а не LINQ to Objects.

...