如何将此LINQ查询转为延迟加载

时间:2010-06-08 06:04:08

标签: c# linq linq-to-entities lazy-loading

我想在我的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() });
}

我在上面的查询中遇到语法错误。我该如何解决这个

3 个答案:

答案 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;