Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/281.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何创建视图模型而不在内存中排序集合_C#_Linq_Entity Framework_Linq To Entities - Fatal编程技术网

C# 如何创建视图模型而不在内存中排序集合

C# 如何创建视图模型而不在内存中排序集合,c#,linq,entity-framework,linq-to-entities,C#,Linq,Entity Framework,Linq To Entities,我有一个视图模型(如下) 我想用我的IQueryable集合和IQueryable集合中的值填充IQueryable。我不想使用附加的实体集合(即Topic.Replies),因为我只希望该主题和doing Topic.Replies.last()的最后一个答复加载内存中的整个实体集合,然后获取列表中的最后一个。我试图留在IQueryable中,以便在数据库中执行查询 我也不想通过主题和查询replyRepository.repress进行访问,因为循环通过IQueryable将启动延迟加载。我

我有一个视图模型(如下)

我想用我的
IQueryable
集合和
IQueryable
集合中的值填充
IQueryable
。我不想使用附加的实体集合(即Topic.Replies),因为我只希望该主题和doing Topic.Replies.last()的最后一个答复加载内存中的整个实体集合,然后获取列表中的最后一个。我试图留在IQueryable中,以便在数据库中执行查询

我也不想通过主题和查询replyRepository.repress进行访问,因为循环通过
IQueryable
将启动延迟加载。我更喜欢构建一个表达式,并在较低的层中完成所有腿部工作

我有以下资料:

IQueryable<TopicsViewModel> topicsViewModel = from x in topicRepository.Topics
                                              from y in replyRepository.Replies
                                              where y.TopicID == x.TopicID
                                              orderby y.PostedDate ascending
                                              select new TopicsViewModel { Topic = x, LastReply = y };
IQueryable topicsViewModel=来自topicRepository.Topics中的x
在replyRepository.repress中来自y
其中y.TopicID==x.TopicID
orderby y.postedate升序
选择new TopicsViewModel{Topic=x,LastReply=y};
但这不起作用。你知道如何填充TopicsViewModel的IQueryable或IEnumerable,以便它查询数据库并获取主题和该主题的最后回复吗?我真的很努力地避免抓住所有与该主题相关的回复。我只想抓住最后的答复


感谢您提供的任何见解。

由于没有人回答,我现在将使用foreach解决方案。我认为,浏览最终将被延迟加载的主题要比填充回复集合好得多,这样我就可以访问集合中的最后一个对象

以下是我现在所做的:

                List<TopicsViewModel> topicsViewModelList = new List<TopicsViewModel>();
                foreach (Topic topic in topics)
                {
                    Reply lastReply = replyRepository.GetRepliesBy_TopicID(topic.TopicID).OrderBy(x => x.PostedDate).LastOrDefault();

                    topicsViewModelList.Add(new TopicsViewModel
                    {
                        Topic = topic,
                        LastReply = lastReply
                    });
                }
List topicsViewModelList=新建列表();
foreach(主题中的主题)
{
Reply lastReply=replyRepository.GetRepliesBy_TopicID(topic.TopicID).OrderBy(x=>x.PostedDate).LastOrDefault();
topicsViewModelList.Add(新的TopicsViewModel
{
主题,
LastReply=LastReply
});
}

我只是先加载我的
IQueryable
,然后循环最后的结果(以确保在循环之前正确地分页数据),并在最后的回复中加载。这似乎避免了填充回复集合,而是只获取每个主题的最后一个回复。

因为没有人回答,所以我现在使用foreach解决方案。我认为,浏览最终将被延迟加载的主题要比填充回复集合好得多,这样我就可以访问集合中的最后一个对象

        from r in replies
        group r by new { r.TopicId } into g
        select new
            {
                TopicId = g.Key.TopicId, 
                LastReply = g.Max(p => p.PostedDate)
            }
以下是我现在所做的:

                List<TopicsViewModel> topicsViewModelList = new List<TopicsViewModel>();
                foreach (Topic topic in topics)
                {
                    Reply lastReply = replyRepository.GetRepliesBy_TopicID(topic.TopicID).OrderBy(x => x.PostedDate).LastOrDefault();

                    topicsViewModelList.Add(new TopicsViewModel
                    {
                        Topic = topic,
                        LastReply = lastReply
                    });
                }
List topicsViewModelList=新建列表();
foreach(主题中的主题)
{
Reply lastReply=replyRepository.GetRepliesBy_TopicID(topic.TopicID).OrderBy(x=>x.PostedDate).LastOrDefault();
topicsViewModelList.Add(新的TopicsViewModel
{
主题,
LastReply=LastReply
});
}

我只是先加载我的
IQueryable
,然后循环最后的结果(以确保在循环之前正确地分页数据),并在最后的回复中加载。这似乎避免了填充回复集合,而是只获取每个主题的最后一个回复。

主题和回复之间是否有导航属性?是的,这就是我提到的附加实体集合。但是,我不想访问该导航属性并触发整个集合的延迟加载。如果我需要该集合中的所有项目,那么这是有道理的,但由于我只需要该集合中的最后一个项目,因此最好以某种方式保留在IQueryable中。当你说“不起作用”时,确切地说是哪个部分不起作用?运行时异常、未返回任何内容或返回所有内容..?主题和回复之间是否有导航属性?是的,这就是我提到的附加实体集合。但是,我不想访问该导航属性并触发整个集合的延迟加载。如果我需要该集合中的所有项目,那么这是有道理的,但由于我只需要该集合中的最后一个项目,因此最好以某种方式保留在IQueryable中。当你说“不起作用”时,确切地说是哪个部分不起作用?运行时异常,未返回任何内容,或返回所有内容..?这无关紧要。任何查询导航属性实体集合的尝试都将触发整个集合的延迟加载。然后LINQ执行.First()或.Last(),这很好,但在幕后,整个集合被加载到内存中,然后我们抓取集合中的第一个或最后一个对象。True。所以,也许您唯一的选择就是使用.Max()函数。找到了一个将SelectMany与.Max()结合在一起的好例子。该代码示例将填充一个TopicsViewModel对象,而不是无关紧要的
IQueryable
。任何查询导航属性实体集合的尝试都将触发整个集合的延迟加载。然后LINQ执行.First()或.Last(),这很好,但在幕后,整个集合被加载到内存中,然后我们抓取集合中的第一个或最后一个对象。True。所以,也许您唯一的选择就是使用.Max()函数。找到了一个将SelectMany与.Max()结合在一起的好例子。该代码示例将填充一个TopicsViewModel对象,而不是一个
IQueryable
        from r in replies
        group r by new { r.TopicId } into g
        select new
            {
                TopicId = g.Key.TopicId, 
                LastReply = g.Max(p => p.PostedDate)
            }