c# - 如何将此 LINQ 查询转换为延迟加载

标签 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
            };

我已经删除了选择查询中的 FavoriteCount 项目,并希望稍后根据特定条件添加它。这是我延迟加载的方式

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

上述查询出现语法错误。我该如何解决这个问题

最佳答案

当您删除前面查询中的 FavoriteCount 时,分配给 posts 的匿名类型不再有该字段;然后在第二个查询中你正在创建另一个匿名类型,只有有一个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

关于c# - 如何将此 LINQ 查询转换为延迟加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2995106/

相关文章:

c# - 从 EF 作为 Dictionary<int,int> 返回 2 列,Id 和 count

c# - 寻路算法来查找每个部分是否连接到特定对象

c# - Linq to Xml 转换列表

c# - 如何在 Entity Framework 中获取多个插入的标识值

linq - Linqpad 中的 UserQuery 是什么?

c# - 从 Linq 中的 Select 查询中查找索引

Linq 分组问题

c# - 从 Entity Framework 中仅检索基类

c# - 如何将 “using” 语句添加到 System.Data.Entity 命名空间

c# - 如何在 lambda 表达式中定义为 LINQ Select 方法中的另一个函数