Как повернуть этот запрос LINQ к ленивой загрузке

Я хотел бы сделать определенный избранный объект к ленивой загрузке последним в моем запросе 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 в запросе Select и хотел бы его к ba, добавленному позже на основе определенных условий. Вот способ, которым у меня есть он ленивый загруженный

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

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

5
задан abatishchev 8 June 2010 в 12:34
поделиться

3 ответа

Когда вы удаляете FavoriteCount в предыдущем запросе, анонимный тип, который присваивается постам, больше не имеет этого поля; затем во втором запросе вы создаете другой анонимный тип, который только имеет 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 во втором запросе.

2
ответ дан 15 December 2019 в 00:51
поделиться

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

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

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 
            }; 
1
ответ дан 15 December 2019 в 00:51
поделиться

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

context.DeferredLoadingEnabled = false;
1
ответ дан 15 December 2019 в 00:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: