由之前的一篇文章《.net core Entity Framework 与 EF Core》我们都已经知道 EF Core 增加了许多特性,并且性能上也有了很大的提升。

但是EF Core是不支持存储过程及视图的映射的,那么直接通过 DbContext 是没有办法直接调用(就是不能直接 "点" 出来)到存储过程与视图的。

上一篇《.net core EF Core 调用存储过程》中已经讲到了存储过程的调用了,这篇就只讲视图了。

对视图来讲,在数据库中 EF Core 根本不知道分不清数据表跟视图的区别,这也导致了无法直接通过 DbContext 直接进行调用视图。

我们来用最简单的 一个.net core 提供的映射的方法 -- DbQuery(还是用之前的测试数据库),直接用 mssql 管理工具创建视图:

创建好视图后,我们同样可以在数据库中看到这个视图:

视图就准备好了,那么,我们接口手动创建一个,用于映射的实体,里面的字段与视图返回的结果一致,名称就无所谓了,因为可以直接映射到对应的视图:

    public class View_BookDetails
{
public int Id { get; set; }
public int Cateid { get; set; }
public string Name { get; set; }
public string Author { get; set; }
public DateTime Createtime { get; set; }
public bool Isdel { get; set; }
public string CateName { get; set; }
}

接下来就是使用 DbQuery 进行映射了

    public partial class LibraryContext : DbContext
{
public LibraryContext()
{
} public LibraryContext(DbContextOptions<LibraryContext> options)
: base(options)
{
} public DbQuery<View_BookDetails> View_BookDetails { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder)
{
modelBuilder.HasAnnotation("ProductVersion", "2.2.3-servicing-35854"); modelBuilder.Query<View_BookDetails>().ToView("View_BookTable"); }
}

重点就两句:

我们调用试试看,通过映射后,我们可以直接 "点" 出来了:

   //调用视图
var books = _context.View_BookDetails.ToList();

结果:

用这个简单的方式,就可以调用到映射好的视图了。当然,我们还可以换一种方法去查,直接去掉  这句,这句只是在 DbContext 上下文中进行了预定义而已。Dbset 是允许这样的,同样 DbContext 实例的 Set 方法也可以。然后用下面的这句,查出来的结果是一样的:

   var results = _context.Query<View_BookDetails>().ToList();

同样的,我们也可以用 Linq 去进行条件查询,比如:

   //调用视图
var books = _context.View_BookDetails.Where(x=>x.Name.Contains("C#高级")).ToList();

挺有意思的吧,当然,不在 DbContext 上下文中进行了预定义的方式也是一样一样的,可以举一反三地去玩一下。

最后来点有意思的,modelBuilder 那里还有另外一种玩法(这玩法不新鲜,不常用),我另外定义一个实体,主要是用来统计的:

(1)定义统计的实体类 CateStatsView:

    /// <summary>
/// 分类中书的数量及作者清单:统计书的数量和作者的数量
/// </summary>
public class CateStatsView
{
public CateStatsView(string name, int bookCount, int authorCount)
{
Name = name;
BookCount = bookCount;
AuthorCount = authorCount;
} public string Name { get; set; }
public int BookCount { get; set; }
public int AuthorCount { get; set; }
}

(2)在 OnModelCreating 中定义查询的实体,并在进行统计:

     modelBuilder.Query<CateStatsView>().ToQuery(
() => Categories.Select(m => new CateStatsView(
m.Name,
m.Books.Count,
m.Books.Select(a => a.Author).Distinct().Count()
)
)
);

(3)调用并返回结果:

    var results = _context.Query<CateStatsView>().ToList();

结果:

最后:视图的作用的话,本来就是可以理解成表,本质上来讲,生成的也就是 SQL 语句进行查询。这次讲的都是很简单的 .net core 中视图的应用。实现的方式都是多种多样的,就像条条大路通罗马。了解多点不是坏事。

.net core EF Core 视图的应用的更多相关文章

  1. asp.net core+ef core

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

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

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

  3. .net core EF Core 调用存储过程

    在这里,我们将尝试去学习一下 .net core EF Core 中调用存储过程. 我们知道,EF Core 是不支持直接调用存储过程的,那它又提供了什么样的方式去执行存储过程呢?有如下方法: 1.F ...

  4. 在vs2015上使用asp.net core+ef core

    官方的文档https://docs.asp.net/en/latest/tutorials/first-mvc-app/start-mvc.html 先来看一下实现的效果

  5. .Net Core EF Core之Sqlite使用及部署

    1.添加引用Nuget包 Microsoft.EntityFrameworkCore.Sqlite Microsoft.EntityFrameworkCore.Design Microsoft.Ent ...

  6. asp.net Core EF core ( Entity Framework 7 ) 数据库更新维护

    CreateData­baseIfNotExists等之前的API已经废弃,现在采用的是微软封装好,简化.高效的API,migrations 因为,旧API,要付出高昂的代价,以及局限性 打开VS20 ...

  7. 个人搭建后台管理模板 Bootstrap4 ,ASP.NET Core,EF Core,JWT

    拥有一个美观好用的网站后台,是很多开发者的梦想,笔者在闲暇时间里搭建了一个不错的后台框架,这里分享诸位开发同仁. 项目地址:https://github.com/kongdf123/KentNoteB ...

  8. EntityFramework Core技术线路(EF7已经更名为EF Core,并于2016年6月底发布)

    官方文档英文地址:https://github.com/aspnet/EntityFramework/wiki/Roadmap 历经延期和更名,新版本的实体框架终于要和大家见面了,虽然还有点害羞.请大 ...

  9. Entity Framework (EF) Core工具创建一对多和多对多的关系

     一. EntirtyFramework(EF)简介 EntirtyFramework框架是一个轻量级的可扩展版本的流行实体框架数据访问技术,微软官方提供的ORM工具让开发人员节省数据库访问的代码时间 ...

随机推荐

  1. 如何在GibHub上传自己的项目

    如何上传项目至GinHub 准备好项目.在项目ssm-crud的目录下右击,点击Git Bash Here,打开git命令行. 在命令行中,输入git init,使项目文件夹加入git管理: 输入gi ...

  2. WPF中Button的背景图片,实现禁止IsMouseOver时显示默认

    <Button x:Name="btnPickUpNum" Click="PickUpNum_OnClick" Grid.Row="1" ...

  3. Python【day 15】基本数据类型-int str bool list

    '''''' ''' 1 python的定义 是一门弱类型的解释性的高级编程语言 这里的高级是相对低级(例如:汇编语言等) 高级编程语言和低级编程语言的区别 1.前者更接近于人的理解--字母组成的语法 ...

  4. DesignPattern系列__09设计模式概述

    设计模式介绍 设计模式是程序员在面对同类软件工程设计问题所总结出来的有用的经验,模式不是代码,而是某类问题的通用解决方案, 设计模(Design pattern)代表了最佳的实践.这些解决方案是众多软 ...

  5. 字体图标引入到HTML---复制用代码

    第一步:在样式里面声明字体: 告诉别人我们自己定义的字体 ps: font-family的名字可以自己起 src是引入了4种字体,不用修改的 @font-face { font-family: 'ic ...

  6. C#如何将DataTable中的列名复制到另一个DataTable

    C#如何将DataTable中的列名复制到另一个DataTable? 仅复制列名,不复制列下的数据: var newDt = new DataTable(); newDt = oldDataTable ...

  7. opencv::DNN介绍

    DNN模块介绍: Tiny-dnn模块 支持深度学习框架 - Caffe - TensorFlow - Torch/PyTorch DNN运用 图像分类 对象检测 实时对象检测 图像分割 预测 视频对 ...

  8. [20190909]完善vim的bccacl插件.txt

    [20190909]完善vim的bccacl插件.txt http://blog.itpub.net/267265/viewspace-2140886/http://blog.itpub.net/26 ...

  9. python3+Scrapy爬虫使用pipeline数据保存到文本和数据库,数据少或者数据重复问题

    爬取的数据结果是没有错的,但是在保存数据的时候出错了,出现重复数据或者数据少问题.那为什么会造成这种结果呢? 其原因是由于Spider的速率比较快,而scapy操作数据库操作比较慢,导致pipelin ...

  10. Python—虚拟环境的创建与管理(virtualenv与virtualenvwrapper)

    virtualenv 1.安装virtualenv包 [root@localhost ~]# pip install virtualenv 2.创建虚拟环境,位置不固定,可以在项目的目录下,也可以不在 ...