Entity Framework 多查询 多样写法

使用EF实现多查询,暂未考虑性能问题

2015年10月6日22:26:51

=====正文=====

我在数据库有三个表,如下图:

sysMenus与sysFunction有主外键关系,而sysUserInfo则与其他二表并无关联。

我现在使用这三个表针对多种情况使用EF实现多种查询手段

方法一: include方法(或EF自身的导航属性)

  查询,要的就是出数据罢了。所以我先说EF自身的导航属性,因为这也算常用方法。

  我所说的导航属性就是:

模型表下方显示的,可以看到只有拥有主外键关联的表才会有导航属性。

使用起来也特别简单,上代码

直接点出来就是表,真是不要太简单了

  而使用include方法则是:

除了多了一个include方法,其他一致的。

区别在于,sql语句生成的不同,使用sql检测工具便知

SELECT TOP (1)
    [Extent1].[fID] AS [fID],
    [Extent1].[mID] AS [mID],
    [Extent1].[fName] AS [fName],
    [Extent1].[fFunction] AS [fFunction],
    [Extent1].[fPicname] AS [fPicname],
    [Extent1].[fStatus] AS [fStatus],
    [Extent1].[fCreatorID] AS [fCreatorID],
    [Extent1].[fCreateTime] AS [fCreateTime],
    [Extent1].[fUpdateID] AS [fUpdateID],
    [Extent1].[fUpdateTime] AS [fUpdateTime],
    [Extent2].[mID] AS [mID1],
    [Extent2].[mParentID] AS [mParentID],
    [Extent2].[mName] AS [mName],
    [Extent2].[mUrl] AS [mUrl],
    [Extent2].[mArea] AS [mArea],
    [Extent2].[mController] AS [mController],
    [Extent2].[mAction] AS [mAction],
    [Extent2].[mSortid] AS [mSortid],
    [Extent2].[mStatus] AS [mStatus],
    [Extent2].[mPicname] AS [mPicname],
    [Extent2].[mLevel] AS [mLevel],
    [Extent2].[mExp1] AS [mExp1],
    [Extent2].[mExp2] AS [mExp2],
    [Extent2].[mCreatorID] AS [mCreatorID],
    [Extent2].[mCreateTime] AS [mCreateTime],
    [Extent2].[mUpdateID] AS [mUpdateID],
    [Extent2].[mUpdateTime] AS [mUpdateTime]
    FROM  [dbo].[sysFunction] AS [Extent1]
    INNER JOIN [dbo].[sysMenus] AS [Extent2] ON [Extent1].[mID] = [Extent2].[mID]

include方法会inner join 表查询出所有数据,而直接使用导航属性的仅仅只是单表查询(没有连sysMenus表怎么与mName呢?疑问点)

所以我还是使用include

但是没有主外键关系的表模型并没有导航属性,于是include并不能使用在表之间没有主外键关系的表中!

方法二:使用join方法

有主外键关系

生成的sql语句

SELECT
    [Extent1].[mID] AS [mID],
    [Extent1].[mName] AS [mName],
    [Extent2].[fName] AS [fName]
    FROM  [dbo].[sysMenus] AS [Extent1]
    INNER JOIN [dbo].[sysFunction] AS [Extent2] ON [Extent1].[mID] = [Extent2].[mID]

无主外键关系

sql语句

SELECT
    [Extent1].[mID] AS [mID],
    [Extent1].[mName] AS [mName],
    [Extent2].[uLoginName] AS [uLoginName]
    FROM  [dbo].[sysMenus] AS [Extent1]
    INNER JOIN [dbo].[sysUserInfo] AS [Extent2] ON [Extent1].[mID] = [Extent2].[uID]

由生成的SQL语句可知,join也可完美连表,不管两表是否有主外键关联。但join方法有一缺点,无法使用多个join连表,要连三个表怎么做呢?答:join做不到啊

方法三:使用类SQL语句(如何读?)

SELECT TOP (1)
    [Extent1].[mID] AS [mID],
    [Extent1].[mParentID] AS [mParentID],
    [Extent1].[mName] AS [mName],
    [Extent1].[mUrl] AS [mUrl],
    [Extent1].[mArea] AS [mArea],
    [Extent1].[mController] AS [mController],
    [Extent1].[mAction] AS [mAction],
    [Extent1].[mSortid] AS [mSortid],
    [Extent1].[mStatus] AS [mStatus],
    [Extent1].[mPicname] AS [mPicname],
    [Extent1].[mLevel] AS [mLevel],
    [Extent1].[mExp1] AS [mExp1],
    [Extent1].[mExp2] AS [mExp2],
    [Extent1].[mCreatorID] AS [mCreatorID],
    [Extent1].[mCreateTime] AS [mCreateTime],
    [Extent1].[mUpdateID] AS [mUpdateID],
    [Extent1].[mUpdateTime] AS [mUpdateTime]
    FROM   [dbo].[sysMenus] AS [Extent1]
    INNER JOIN [dbo].[sysFunction] AS [Extent2] ON [Extent1].[mID] = [Extent2].[mID]
    INNER JOIN [dbo].[sysUserInfo] AS [Extent3] ON [Extent1].[mID] = [Extent3].[uID]

就像写SQL语句一样,但我感觉跟include是一样的,因为没有导航属性,查出来也用不了

如有错误之处,望各位看管能不吝指出。

时间: 2024-10-25 13:01:05

Entity Framework 多查询 多样写法的相关文章

Entity Framework的查询

Entity Framework是个好东西,虽然没有Hibernate功能强大,但使用更简便.今天整理一下常见SQL如何用EF来表达,Func形式和Linq形式都会列出来(本人更喜欢Func形式). 1.简单查询: SQL: SELECT * FROM [Clients] WHERE Type=1 AND Deleted=0 ORDER BY ID EF: //Func形式 var clients = ctx.Clients.Where(c => c.Type == 1 && c.D

整理一下Entity Framework的查询

Entity Framework是个好东西,虽然没有Hibernate功能强大,但使用更简便.今天整理一下常见SQL如何用EF来表达,Func形式和Linq形式都会列出来(本人更喜欢Func形式). 1.简单查询: SQL: SELECT * FROM [Clients] WHERE Type=1 AND Deleted=0 ORDER BY ID EF: //Func形式 var clients = ctx.Clients.Where(c => c.Type == 1 && c.D

Entity Framework之查询总结

本节针对EF当前支持的查询方式进行分析比较,和简单自定义条件查询的实现. EF的查询方式 自定义条件查询 一.EF的查询方式 EF提供的查询方式有以下几种 原始SQL查询 LINQ To Entity and Lambda ESQL 与 ObjectQuery ObjectQuery 查询生成器 1.原始SQL查询 在EF 4.1 新增加的DbContext 除了支持LINQ与Lambda查询外,新增了支持原始SQL查询,但是不支持ESQL与ObjectQuery查询. DemoDBEntiti

Entity Framework异步查询和保存

EF6开始提供了通过async和await关键字实现异步查询和保存的支持(.net 4.5及更高版本).虽然不是所有的操作都能从异步中获益,但是耗时的操作.网络或IO密集型任务中,使用异步可以提升客户端性能和增强服务器的扩展性. 本文将覆盖一下主题: 实例演练异步操作 创建模型 创建同步程序 改为异步操作 实例演练异步操作 下面演练将通过对比,很容易的观察异步操作和同步操作,该演练目的不是说明何时才是异步操作的关键场景. 创建模型 下面使用CodeFirst的流程创建模型并生成数据库,不过异步方

动态Entity Framework查询:Dynamic Query 介绍

小分享:我有几张阿里云优惠券,用券购买或者升级阿里云相应产品最多可以优惠五折!领券地址:https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=ohmepe03 Dynamic Query是一个支持动态Entity Framework查询的库.它的设计初衷是为了减少在管理系统中大量出现的对一个数据集进行查找.排序.分页的这类场景的开发工作量,其设计思想是"markup is code ".通过

Entity Framework Code First实体关联数据加载

小分享:我有几张阿里云优惠券,用券购买或者升级阿里云相应产品最多可以优惠五折!领券地址:https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=ohmepe03 在项目过程中,两个实体数据之间在往往并非完全独立的,而是存在一定的关联关系,如一对一.一对多及多对多等关联.存在关联关系的实体,经常根据一个实体的实例来查询获取与之关联的另外实体的实例. Entity Framework常用处理数据关联加载的方

Entity Framework 6 开发系列 目录

2014 年开始接触 Entity Framework 6 也快两年,用它已经沉淀了一个成熟架构,也用来开发了不少大大小小的产品和项目,直到这段时间,才真正有时间来回顾,重新学习它,为让大家更加了解Entity Framework 6,以及想把这两年中,开发过程中碰到的种种问题,跟大家分享,特此想做一个Entity Framework 6 开发系列的计划 第一篇:Entity Framework 简介 第二篇:Entity Framework CodeFirst & Model 映射 第三篇:E

Entity Framework技巧系列之八 - Tip 29 – 34

提示29. 怎样避免延迟加载或Load()阅读器问题 如果你有如下这样的代码: 1 var results = from c in ctx.Customers 2 where c.SalesPerson.EmailAddress == "-" 3 select c; 4 foreach(var customer in results) 5 { 6 Console.WriteLine(customer.Name); 7 if (IsInteresting(customer)) 8 { 9

让Entity Framework不再私闯sys.databases 不自动创建数据库(转载)

原文:http://www.cnblogs.com/dudu/archive/2011/12/27/entity_framework_sys_databases.html 这里的"私闯sys.databases"是指Entity Framework默认发起的查询:SELECT Count(*) FROM sys.databases WHERE [name]=N'数据库名' 注:本文针对的是Entity Framework Code First场景,Entity Framework的版本