我想在我的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
};
我已经删除了select查询中的FavoriteCount项目,并希望稍后根据某些条件添加它。这是我懒惰加载的方式
if (GetFavoriteInfo)
{
posts = posts.Select(x => new { FavoriteCount = context.PostVotes.Where(y => y.PostVote_postid == x.post_id).Count() });
}
我在上面的查询中遇到语法错误。我该如何解决这个
答案 0 :(得分:2)
当您删除先前查询中的FavoriteCount
时,分配给posts
的匿名类型不再具有该字段;然后在第二个查询中,您正在创建另一个另一个匿名类型 其中包含FavoriteCount
- 所以当您尝试将其重新分配给{{ 1}}你得到一个不兼容的类型错误。
执行此操作的一种方法是将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
。
答案 1 :(得分:1)
1.-您在第一个var上投射的类型与第二个分配上的类型不同,因为第一个类型是匿名类型
你可以试试这个
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
};
答案 2 :(得分:1)
这blog entry会对您有所帮助。还有一件事,您可以使用Data Context对象的以下属性启用/禁用延迟加载。
context.DeferredLoadingEnabled = false;