Я хотел бы сделать определенный избранный объект к ленивой загрузке последним в моем запросе 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() });
}
Я получаю синтаксическую ошибку с этим вышеупомянутый запрос. Как я фиксирую это
Когда вы удаляете 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
во втором запросе.
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
};
Эта запись в блоге поможет вам. Еще одна вещь: вы можете включить / отключить отложенную загрузку, используя следующее свойство объекта контекста данных.
context.DeferredLoadingEnabled = false;