// 引用 using Microsoft.EntityFrameworkCore;
// 摘要:
// Specifies related entities to include in the query results. The navigation property
// to be included is specified starting with the type of entity being queried (TEntity).
// Further navigation properties to be included can be appended, separated by the
// '.' character.
//
// 参数:
// source:
// The source query.
//
// navigationPropertyPath:
// A string of '.' separated navigation property names to be included.
//
// 类型参数:
// TEntity:
// The type of entity being queried.
//
// 返回结果:
// A new query with the related data included.
public static IQueryable<TEntity> Include<TEntity>([NotNullAttribute] this IQueryable<TEntity> source, [NotNullAttribute][NotParameterized] string navigationPropertyPath) where TEntity : class;

core中提供的扩展方法Include有两个重载方法,我们这里使用第一个重载方法,传参数导航属性名字,返回IQueryable<TEntity>,多对多导航属性,二级导航属性需要用‘.’点分隔符连接,提供完整导航属性名称。

下面是我封装的扩展方法:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Threading.Tasks;
using Microsoft.EntityFrameworkCore; namespace System
{
public static class IQueryableExtensions
{
/// <summary>
/// 导航属性,参数:导航属性名称字符串,支持多表查询
/// 多级导航属性:“属性名.属性名” 用‘.’连接
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="obj"></param>
/// <param name="Properts"></param>
/// <returns></returns>
public static IQueryable<T> In<T>(this IQueryable<T> obj, params string[] Properts) where T : class
{
IQueryable<T> data = obj;
foreach (var prop in Properts)
{
data = data.Include(prop);
}
return data;
} }
}
public class FREEFUNC
{
[Key]
public long FFID { get; set; }
public Nullable<int> SCID { get; set; }
[ForeignKey("FUNCDEFINE")]
public int FID { get; set; }
public virtual FUNCDEFINE FUNCDEFINE { get; set; }
} public partial class FUNCDEFINE
{
[Key]
public int FID { get; set; }
public string FNAME { get; set; }
public int CANOPR { get; set; }
public int ISMENU { get; set; }
public int ISEDIT { get; set; }
public Nullable<int> FUNCTYPE { get; set; }
[ForeignKey("FUNCDEFINE")]
public Nullable<int> HIGHFID { get; set; }
public string ICON { get; set; }
public string CONTROLLER { get; set; }
public string ACTION { get; set; } public virtual FUNCDEFINE HIGHF { get; set; }
}

调用实例:

var list = FREEFUNCService.GetList().In("FUNCDEFINE", "FUNCDEFINE.HIGHF").ToList();

注:GetList()返回IQueryable<FREEFUNC>类型,IEnumerable<T>类型不支持Include方法,导航属性必须延迟查询时调用,最终生成连表查询sql语句。

另外不使用Include方法也可以获取导航属性,获得IQueryable对象延迟查询,再使用.Select查询时返回值中获取导航属性值,最终也会生成连表查询,foreach不支持。

.net core ef中 获取数据直接ToList() 导航属性为null。

ASP.NET Core EF 查询获取导航属性值,使用Include封装的更多相关文章

  1. (24)ASP.NET Core EF查询(查询的工作原理、跟踪与非跟踪查询)

    1.查询生命周期 在进入正题时候,我们先来了解EF Core查询的生命周期. 1.1LINQ查询会由Entity Framework Core处理并生成给数据库提供程序可处理的表示形式(说白了就是生成 ...

  2. (25)ASP.NET Core EF查询(复杂查询运算符、原生SQL查询、异步查询)

    1.复杂查询运算符 在生产场景中,我们经常用到LINQ运算符进行查询获取数据,现在我们就来了解下生产场景经常出现几种复杂查询运算符. 1.1联接(INNER JOIN) 借助LINQ Join运算符, ...

  3. ASP.NET EF 延迟加载,导航属性延迟加载

    ASP.NET EF 延迟加载,导航属性延迟加载   EF(EntityFramework)原理:属于ORM的一种实现 通过edmx文件来查看三部分:概念模型,数据模型,映射关系,上下文DbConte ...

  4. 你所不知道的库存超限做法 服务器一般达到多少qps比较好[转] JAVA格物致知基础篇:你所不知道的返回码 深入了解EntityFramework Core 2.1延迟加载(Lazy Loading) EntityFramework 6.x和EntityFramework Core关系映射中导航属性必须是public? 藏在正则表达式里的陷阱 两道面试题,带你解析Java类加载机制

    你所不知道的库存超限做法 在互联网企业中,限购的做法,多种多样,有的别出心裁,有的因循守旧,但是种种做法皆想达到的目的,无外乎几种,商品卖的完,系统抗的住,库存不超限.虽然短短数语,却有着说不完,道不 ...

  5. C#无限极分类树-创建-排序-读取 用Asp.Net Core+EF实现之方法二:加入缓存机制

    在上一篇文章中我用递归方法实现了管理菜单,在上一节我也提到要考虑用缓存,也算是学习一下.Net Core的缓存机制. 关于.Net Core的缓存,官方有三种实现: 1.In Memory Cachi ...

  6. asp.net core+ef core

    asp.net core+ef core 官方的文档https://docs.asp.net/en/latest/tutorials/first-mvc-app/start-mvc.html 先来看一 ...

  7. EF Code First 导航属性 与外键(转载)

    EF Code First 导航属性 与外键 一对多关系 项目中最常用到的就是一对多关系了.Code First对一对多关系也有着很好的支持.很多情况下我们都不需要特意的去配置,Code First就 ...

  8. ASP.NET Core 注入和获取 AppSettings 配置

    ASP.NET Core 项目中有个appsettings.json配置文件,用于存放一些配置信息,比如数据库连接字符串等,但访问的话,只能在 ASP.NET Core 项目中获取,如果我们在其他项目 ...

  9. Asp.net Core + EF Core + Bootstrap搭建的MVC后台通用管理系统模板(跨平台版本)

    Asp.net Core + EF Core + Bootstrap搭建的MVC后台通用管理系统模板(跨平台版本) 原创 2016年07月22日 10:33:51 23125 6月随着.NET COR ...

随机推荐

  1. Hibernate_day01--解决配置文件没有提示问题_演示常见错误

    解决配置文件没有提示问题 1 可以上网 2 把约束文件引入到eclipse中 (1)在配置文件中复制一句话 重启eclipse开发工具 演示常见错误 1 在映射配置文件中,把name属性值写错了,和实 ...

  2. 引入外部文件的时候为什么省略http:

    [摘要]相信很多时候大家在使用网上的实例代码的时候,需要引入外部文件,然而它们通常都是省略了http:,这是为什么呢? 先给大家看一个简单的小例子,引入外部jquery文件: <script s ...

  3. 获取ScrollView的onScrollListener

    scrollView.getViewTreeObserver().addOnScrollChangedListener(new OnScrollChangedListener() { @Overrid ...

  4. Arduino开发版学习计划--蓝牙控制小车行走

    蓝牙模块一共6个引脚,我们一般只需要接4个线就可以了,分别是VCC.GND.TXD.RXD这四个引脚,我们分别接到arduino板子上,VCC接3.3V,GND接板子的GND,蓝牙TXD接板子的RXD ...

  5. 类似hibernate实现sql增删改错

    Util package utils; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.Ha ...

  6. LeetCode-Combination Sum IV

    Given an integer array with all positive numbers and no duplicates, find the number of possible comb ...

  7. 利用脚手架vue cli搭建vue项目

    vue.js https://vuejs.org/ 基础: http://cn.vuejs.org/v2/guide/installation.html 1.安装需要利用npm包管理器,所以首先安装n ...

  8. ITIL信息技术基础架构库

    服务是什么? 服务是向客户提供价值的一种手段,使客户不用承担特定的成本和风险就可以获得所期望的结果 PS:运维工作中需要实时反馈 RACI RACI是一个相对直观的模型,用以明确组织变革过程中的各个角 ...

  9. 演示一个简单的Redis队列

    0.Windows Service版下载 https://github.com/rgl/redis/downloads 1.新建一个Console项目 打开Nuget控制台,执行以下命令 Instal ...

  10. dict文档

    文档 class dict(object): """ dict() -> new empty dictionary 创建字典的方式有两种: 1.dic = {} 2 ...