Loading [MathJax]/jax/output/CommonHTML/config.js
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >实体框架:查询子实体

实体框架:查询子实体
EN

Stack Overflow用户
提问于 2011-10-13 10:55:34
回答 4查看 54.9K关注 0票数 47

似乎我无法从db中获取父级及其子级的子集。

例如..。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
db.Parents
.Include(p => p.Children)
.Where(p => p.Children.Any(c => c.Age >= 5))

这将返回具有年龄为5+的孩子的所有父母,但是如果我遍历Parents.Children集合,所有的孩子都会出现(不仅仅是那些5岁以上的孩子)。

现在,查询对我来说是有意义的(我已经要求包括孩子,我已经得到他们了!),但是可以想象,在某些场景中,我希望将where子句应用于孩子集合。

如何才能获得每个父母都有一个经过过滤的子代集合(Age>=5)的IEnumerable?

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2011-10-14 13:36:41

要在单个数据库往返中获得具有筛选的子代集合的父代集合,唯一的方法是使用投影。由于Include不支持过滤,所以不能使用Include,它总是加载整个集合。@Daz显示的explicite加载方式需要每个父实体一次往返。

示例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var result = db.Parents
    .Select(p => new
    {
        Parent = p,
        Children = p.Children.Where(c => c.Age >= 5)
    })
    .ToList();

您可以直接使用此匿名类型对象的集合。(您也可以投影到自己的命名类型,而不是匿名投影(但不是像Parent这样的实体)。)

如果您不禁用更改跟踪(例如,使用AsNoTracking() ),EF的上下文也会自动填充ParentChildren集合。在这种情况下,您可以将父对象投影到匿名结果类型之外(发生在内存中,没有数据库查询):

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var parents = result.Select(a => a.Parent).ToList();

对于每个Parentparents[i].Children将包含您过滤的子项。

编辑到问题中的最后一次编辑:

我想要的是a)孩子超过5岁的父母名单(只包括这些孩子)。

上面的代码将返回所有父代,并仅包括Age >= 5的子代,因此,如果只有Age < 5的子代,则可能也包括具有空的子代集合的父代。您可以对父代使用附加的Where子句来筛选出这些子代,以便仅获取至少具有一个(Any)子代且Age >= 5的父代:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var result = db.Parents
    .Where(p => p.Children.Any(c => c.Age >= 5))
    .Select(p => new
    {
        Parent = p,
        Children = p.Children.Where(c => c.Age >= 5)
    })
    .ToList();
票数 52
EN

Stack Overflow用户

发布于 2011-10-13 12:00:22

以你的例子为例,下面的代码应该能做你需要的事情。请查看here以获取更多信息。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
db.Entry(Parents)
.Collection("Children")
.Query().Cast<Child>()
.Where(c => c.Age >= 5))
.Load();
票数 3
EN

Stack Overflow用户

发布于 2011-10-14 12:57:41

我认为父母和孩子并不是真正适合作为单独的实体。孩子也可以是父母,而且孩子通常有两个父母(一个父亲和一个母亲),所以这不是最简单的上下文。但我假设您只有一个简单的1:n关系,就像我使用的下面的主从模型一样。

你需要做的是做一个left outer join (这个答案让我走上了正确的道路)。这样的连接有点棘手,但下面是代码

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var query = from m in ctx.Masters
            join s in ctx.Slaves
              on m.MasterId equals s.MasterId into masterSlaves
            from ms in masterSlaves.Where(x => x.Age > 5).DefaultIfEmpty()
            select new {
              Master = m,
              Slave = ms
            };

foreach (var item in query) {
  if (item.Slave == null) Console.WriteLine("{0} owns nobody.", item.Master.Name);
  else Console.WriteLine("{0} owns {1} at age {2}.", item.Master.Name, item.Slave.Name, item.Slave.Age);
}

这将转换为以下使用EF 4.1的SQL语句

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT 
[Extent1].[MasterId] AS [MasterId], 
[Extent1].[Name] AS [Name], 
[Extent2].[SlaveId] AS [SlaveId], 
[Extent2].[MasterId] AS [MasterId1], 
[Extent2].[Name] AS [Name1], 
[Extent2].[Age] AS [Age]
FROM  [dbo].[Master] AS [Extent1]
LEFT OUTER JOIN [dbo].[Slave] AS [Extent2]
ON ([Extent1].[MasterId] = [Extent2].[MasterId]) AND ([Extent2].[Age] > 5)

请注意,在联接的集合上而不是在from和select之间对年龄执行额外的where子句非常重要。

编辑:

如果需要分层结果,可以通过执行分组来转换平面列表:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
var hierarchical = from line in query
                   group line by line.Master into grouped
                   select new { Master = grouped.Key, Slaves = grouped.Select(x => x.Slave).Where(x => x != null) };

foreach (var elem in hierarchical) {
   Master master = elem.Master;
   Console.WriteLine("{0}:", master.Name);
   foreach (var s in elem.Slaves) // note that it says elem.Slaves not master.Slaves here!
     Console.WriteLine("{0} at {1}", s.Name, s.Age);
}

请注意,我使用匿名类型来存储分层结果。当然,您也可以创建一个特定类型,如下所示

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
class FilteredResult {
  public Master Master { get; set; }
  public IEnumerable<Slave> Slaves { get; set; }
}

然后将组投影到该类的实例中。如果您需要将这些结果传递给其他方法,这会更容易。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7753039

复制
相关文章
MVC架构在Asp.net中的应用和实现
摘要:本文主要论述了MVC架构的原理、优缺点以及MVC所能为Web应用带来的好处。并以“成都市信息化资产管理系统”框架设计为例,详细介绍其在Asp.net环境下的具体实现。旨在帮助Web设计开发者更好的了解和掌握MVC,合理利用MVC构建优秀的Web应用。
莫问今朝
2019/02/25
3.7K0
使用MVC实现登录功能
                  using System.Data.SqlClient;
wfaceboss
2019/04/08
9880
在 ASP.NET Core 中安装 MVC
到目前为止,我们在本系列视频中使用的 ASP.NET Core 项目是使用“空”项目模板生成的。目前这个项目没有设置和安装 MVC。
角落的白板报
2019/05/15
1.5K0
ASP.NET Core MVC中如何使用Session实现身份验证
我们需要在用户登录以后记录当前登录用户的会话状态,ASP.NET Core 已经内置发布了一个关于会话的程序包(Microsoft.Extensions.DependencyInjection),里面提供了用于管理会话状态的中间件。
跟着阿笨一起玩NET
2021/02/02
3.9K0
ASP.NET Core MVC中如何使用Session实现身份验证
WebSocket在ASP.NET MVC4中的简单实现
WebSocket 规范的目标是在浏览器中实现和服务器端双向通信。双向通信可以拓展浏览器上的应用类型,例如实时的数据推送、游戏、聊天等。有了WebSocket,我们就可以通过持久的浏览器和服务器的连接实现实时的数据通信,再也不用傻傻地使用连绵不绝的请求和常轮询的机制了,费时费力,当然WebSocket也不是完美的,当然,WebSocket还需要浏览器的支持,目前IE的版本必须在10以上才支持WebSocket,Chrome Safari的最新版本当然也都支持。本节简单介绍一个在服务器端和浏览器端实现WebS
小白哥哥
2018/03/07
2.6K0
WebSocket在ASP.NET MVC4中的简单实现
在ASP.NET MVC 4中使用Kendo UI Grid
Kendo UI 是Telerik推出的一套based on jQuery 的 Framework,提供了很多控件(Menu 、Grid 、Combox等...), 底层以Html5 + jQuery 来打造,并且兼容于各大浏览器,包含IE7、IE8。相关介绍可以参考AJAX式数据清单的新选择-Kendo UI Grid。 以下内容参考台湾的黑老大的文章:在ASP.NET MVC 4中使用Kendo UI Grid 建立一个ASP.NET MVC 4专案 使用NuGet安装KendoUIWeb及Kendo
张善友
2018/01/22
3.3K0
在ASP.NET MVC 4中使用Kendo UI Grid
ASP.NET MVC 4中的单页面应用程序
ASP.NET MVC 4 beta中包含了一个实验项目,用作开发“单页面应用程序(single page applications)”。该项目也称为ASP.NET SPA,其项目类型基于一组开源库以及WPF、Silverlight上流行的MVVM模式。 浏览器端 位于浏览器端技术组底部的是著名的jQuery库,与之一起的还有Unobtrusive Ajax、jQuery UI和jQuery Validation插件。 接下来的技术是Upshot。它是构建于jQuery和Knockout之上的数据访问和缓存
张善友
2018/01/19
1.6K0
在 Tekton 中如何实现审批功能
常见的 CICD 引擎并不适合直接提供给业务方使用。主要原因在于用户学习成本高、缺乏必要的鉴权、维护升级难度大。
陈少文
2021/06/26
2K0
在 Tekton 中如何实现审批功能
c# asp.net 实现分页(pager)功能
分页PagerHelper辅助类 using System; using System.Web; public class PagerHelper { #region 获取分页的Html代码 /// <summary> /// 获取分页的Html代码 /// 当前页码方法内部根据Request["page"]获取 /// </summary> /// <param name="pageSize">每一页数量</param> /// <param nam
纯粹是糖
2018/03/14
2.4K0
c#  asp.net 实现分页(pager)功能
JQuery文件上传插件ajaxFileUpload在Asp.net MVC中的使用
0 ajaxFileUpload简介 ajaxFileUpload插件是一个非常简单的基于Jquery的异步上传文件的插件,使用过程中发现很多与这个同名的,基于原始版本基础之上修改过的插件,文件版本比较多,我把我自己使用的ajaxFileUpload文件上传到博客园上了,想要使用的朋友可以下载:http://files.cnblogs.com/files/fonour/ajaxfileupload.js。 整个插件源码不到200行,实现非常简单,大致原理就是通过js动态创建隐藏的表单,然后进行提交操作,达到
阿炬
2018/05/11
3.3K0
在ASP.NET MVC中如何应用多个相同类型的ValidationAttribute?
ASP.NET MVC采用System.ComponentModel.DataAnnotations提供的元数据验证机制对Model实施验证,我们可以在Model类型或者字段/属性上应用相应的ValidationAttribute。但是在默认情况下,对于同一个类型的ValidationAttribute特性只允许一个应用到目标元素上——即使我们将AllowMultiple属性设置为True。这篇文章的目的就是为了解决这个问题。[源代码从这里下载] 一、一个自定义ValidationAttribute:Ran
蒋金楠
2018/02/07
2.1K0
在ASP.NET MVC中如何应用多个相同类型的ValidationAttribute?
在ASP.NET MVC中使用“RadioButtonList”和“CheckBoxList”
在《为HtmlHelper添加一个RadioButtonList扩展方法》中我通过对HtmlHelper和HtmlHelper<Model>的扩展使我们可以采用”RadioButtonList”的方式对一组类型为“radio”的<input>元素进行操作。昨天对对此进行了一些改进,并将“CheckBoxList”的功能添加进来。[源代码从这里下载] 一、有何特别之处? 和我的很多文章一样,旨在提供一种大体的解决方案,本解决方案旨在解决如下一些问题: 通过独立的组件对绑定到ListControl(ASP.NE
蒋金楠
2018/01/16
1.3K0
在ASP.NET MVC中使用“RadioButtonList”和“CheckBoxList”
《从零开始学ASP.NET CORE MVC》:VS2019创建ASP.NET Core Web程序(三)
步骤1:在Visual Studio 2019中创建新的asp.net Core项目
角落的白板报
2019/05/05
3.9K0
《从零开始学ASP.NET CORE MVC》:VS2019创建ASP.NET Core Web程序(三)
《从零开始学ASP.NET CORE MVC》:VS2017创建ASP.NET Core Web程序(三)
步骤1:在Visual Studio 2017中创建新的asp.net Core项目
角落的白板报
2019/05/05
2.8K0
《从零开始学ASP.NET CORE MVC》:VS2017创建ASP.NET Core Web程序(三)
在ASP.NET MVC 中获取当前URL、controller、action
一、URL的获取很简单,ASP.NET通用: 【1】获取 完整url (协议名+域名+虚拟目录名+文件名+参数)  string url=Request.Url.ToString();  【2】获取 虚拟目录名+页面名+参数:  string url=Request.RawUrl; (或 string url=Request.Url.PathAndQuery;) 【3】获取 虚拟目录名+页面名: string url=HttpContext.Current.Request.Url.AbsoluteP
欢醉
2018/01/22
2.4K0
ASP.NET Core MVC 概述
ASP.NET Core MVC 是使用“模型-视图-控制器”设计模式构建 Web 应用和 API 的丰富框架。 什么是 MVC 模式? 模型-视图-控制器 (MVC) 体系结构模式将应用程序分成 3
程序你好
2018/07/20
6.4K0
js checkbox复选框实现单选功能[通俗易懂]
发布者:全栈程序员栈长,转载请注明出处:https://javaforall.cn/139018.html原文链接:https://javaforall.cn
全栈程序员站长
2022/08/23
5.8K0
ASP.NET MVC 异步实现
在 MVC 中实现异步操作有两种方法,一种是使用jQuery的异步函数,另一种就是使用MVC的 AjaxHelper
李郑
2019/12/04
1.2K0
国内 Mono 相关文章汇总
一则新闻《软件服务提供商Xamarin融资1200万美元》,更详细的内容可以看Xamarin的官方博客Xamarin raises $12M to help you make better apps faster →。这篇新闻里告诉了我们目前Mono的用户规模“使用Xamarin软件的应用开发者已经超过15万,其中付费用户约为7500名。在Xamarin的客户中,还包括一些知名的企业,如美国国家仪器(National Instruments)和数字音乐订阅服务商Rdio等”。一直关注和研究Mono项目,今天
张善友
2018/01/26
11.4K0
在 ASP.NET MVC 中使用异步控制器
可以通过 AsyncController 类编写异步操作方法。 可以对长时间运行的、非 CPU 绑定的请求使用异步操作方法。 这样可避免在处理请求时阻塞 Web 服务器执行工作。 AsyncController 类通常用于长时间运行的 Web 服务调用。 本主题包含以下各节: 线程池处理请求的方式 处理异步请求 选择同步操作方法或异步操作方法 将同步操作方法转换为异步操作方法 并行执行多个操作 将特性添加到异步操作方法 使用 BeginMethod/EndMethod 模式 类参考 与本主题对应的包含源代码
逸鹏
2018/04/10
1.9K0

相似问题

在asp.net mvc中实现“预览”功能

37

在ASP.NET MVC中实现“记住我”功能

11

ASP.NET MVC C#如何使用此功能

11

如何在ASP.NET MVC中实现排序功能

13

在Asp.Net MVC中使用Google Workbox实现离线功能

227
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文