Как превратить этот LINQ-запрос в ленивую загрузку - PullRequest
5 голосов
/ 08 июня 2010

Я бы хотел сделать определенный элемент для отложенной загрузки последнего в моем запросе linq. Вот мой запрос

var posts = from p in context.post
            where p.post_isdeleted == false && p.post_parentid == null
            select new
            {
                p.post_date,
                p.post_id,
                p.post_titleslug,
                p.post_votecount,
                FavoriteCount = context.PostVotes.Where(x => x.PostVote_postid == p.post_id).Count() //this should load latter
            };

Я удалил элемент FavoriteCount в запросе выбора и хотел бы, чтобы он был добавлен позже на основании определенных условий. Вот как у меня это лениво загружено

if (GetFavoriteInfo)
{
     posts = posts.Select(x => new { FavoriteCount = context.PostVotes.Where(y => y.PostVote_postid == x.post_id).Count() });
}

Я получаю синтаксическую ошибку с этим запросом выше. Как мне это исправить

Ответы [ 3 ]

2 голосов
/ 08 июня 2010

Когда вы удаляете FavoriteCount в предыдущем запросе, анонимный тип, которому присваивается posts, больше не имеет этого поля; затем во втором запросе вы создаете другой анонимный тип, который only содержит FavoriteCount, поэтому при попытке переназначить его на posts вы получите ошибка несовместимых типов.

Один из способов сделать это - оставить FavoriteCount в первом запросе, но сделать его FavoriteCount = -1 (или другим значением, указывающим, что он еще не загружен), а затем во втором вы можете делать:

posts = posts.Select(p => new { // reassign existing stuff, 
                                p.post_date,
                                p.post_id,
                                p.post_titleslug,
                                p.post_votecount,
                                FavoriteCount = context.etc.etc. 
                              });

Вы должны выполнить переназначение, потому что анонимные типы неизменны; Один из способов - создать класс PostInfo с этими полями, тогда вы можете просто установить FavoriteCount во втором запросе.

1 голос
/ 08 июня 2010

Эта запись в блоге поможет вам. Еще одна вещь, вы можете включить / отключить отложенную загрузку, используя следующее свойство объекта Data Context.

context.DeferredLoadingEnabled = false;
1 голос
/ 08 июня 2010

1.- тип, который вы проецируете на первую переменную, не совпадает с типом во втором назначении, поскольку первый тип является анонимным

Вы можете попробовать это

var posts = from p in context.post 
            where p.post_isdeleted == false && p.post_parentid == null 
            select new 
            { 
                p.post_date, 
                p.post_id, 
                p.post_titleslug, 
                p.post_votecount, 
                FavoriteCount = GetFavoriteInfo?context.PostVotes.Where(x => x.PostVote_postid == p.post_id).Count():null //this should load latter 
            }; 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...