一、linq和ef的差别

我们做项目时,难免会遇到用的不知道是啥,及把linq和EF搞混了。今天我带领大家梳理下思路,首先说linq查询,然后介绍EF查询

1.linq查询

  当我们使用linq查询时,转到定义会调到Queryable 类,  那么也就是说,这个类封装了linq所有查询的方法。

  IQeurable(IQuerable<T>)不会立即在内存里创建持久数据,只有遍历它(如通过foreach)、把它转换成List等情况下才会向内存加载数据,它可以实现“延期执行”,如果当前被加载的实体有关联实体,此关联实体可被接下来的访问加载。

2.EF查询

转到定义可以看到,所有EF查询方法都继承自DbSet类,提供了我们最常用的方法 :Add(TEntity entity),Remove(TEntity entity),Find(params object[] keyValues)

如果有主外键表相关操作时,用EF的find方法,其余能通用的都能通过,另外,返回值类型有所不同,linq两个方法返回的都是集合,find返回的是单个实体。但有一点是,它们都可以用var来接收.

 原文:https://www.cnblogs.com/shuai7boy/p/5347285.html

二、查询

1.简单查询

2.多表查询

左链接

            DataClasses1DataContext db = new DataClasses1DataContext();
var leftJoinSql = from student in db.Student
join book in db.Book on student.ID equals book.StudentID into temp
from tt in temp.DefaultIfEmpty()
select new
{
sname= student.Name,
bname = tt==null?"":tt.Name//这里主要第二个集合有可能为空。需要判断
};

3.高级查询

 public List<User> GetUsers(string companyID, string userName, int skip, int limit)
{
var dc = new DbContext();
var query = (from c in dc.Users
join d in dc.UserRoles on c.Id equals d.UserId
join e in dc.Roles on d.RoleId equals e.Id
where c.CompanyId == companyID && c.IsDeleted == false && (string.IsNullOrWhiteSpace(userName) ? true : c.UserName.Contains(userName))
orderby c.Id
select new
{
Id = c.Id,
UserName = c.UserName,
RoleName = e.Name
}).Skip(skip).Take(limit).ToList()
.Select(x => new User
{
Id = x.Id,
UserName = x.UserName,
RoleName = x.RoleName
}).ToList(); return query;
}

这个查询是一个包含了条件过滤、分页、多表、转换为实体列表的综合查询,缺点是条件过滤无法动态化

LINQ to SQL语句学习系列文章推荐:https://kb.cnblogs.com/page/42465/

4.group by

from a in b

group a by new {a.x} into aa

select new

{

x = aa.Key.x

y = aa.Sum(s=>s.x)

}

三、LINQKit扩展

1. 判空扩展 - AndIf

public static class PredicateBuilderExtensions
{
public static Expression<Func<T, bool>> AndIf<T>(this ExpressionStarter<T> expr1, bool isExists, Expression<Func<T, bool>> expr2)
{
if (isExists)
{
return expr1.And(expr2);
} return expr1;
}
public static Expression<Func<T, bool>> AndIf<T>(this Expression<Func<T, bool>> expr1, bool isExists, Expression<Func<T, bool>> expr2)
{
if (isExists)
{
return expr1.And(expr2);
} return expr1;
}
}

具体使用

var predicate = PredicateBuilder.New<Order>();
predicate.Start(s => s.Date >= input.StartDate);
predicate.AndIf(!input.No.IsNullOrWhiteSpace(), s => (s.No.Contains(input.No)));

附:

string的 IsNullOrWhiteSpace扩展

public static class StringExtensions
{
public static bool IsNullOrEmpty(this string str)
{
return string.IsNullOrEmpty(str);
} public static bool IsNullOrWhiteSpace(this string str)
{
return string.IsNullOrWhiteSpace(str);
}
}

参考文章

https://www.cnblogs.com/xinjian/archive/2010/11/17/1879959.html

Entity framework中LINQ的使用的更多相关文章

  1. [转]在Entity Framework中使用LINQ语句分页

    本文转自:http://diaosbook.com/Post/2012/9/21/linq-paging-in-entity-framework 我们知道,内存分页效率很低.并且,如果是WebForm ...

  2. 在Linq to sql 和 Entity framework 中使用lambda表达式实现left join

    在Linq to sql 和 Entity framework 中使用lambda表达式实现left join 我们知道lambda表达式在Linq to sql 和 Entity framework ...

  3. [转]Entity Framework vs. LINQ to SQL

    Entity Framework和LINQ to SQL到底有什么区别?这是一个很常见的问题.下面的表中简要罗列了两种技术的主要区别. LINQ to SQL Entity Framework 复杂度 ...

  4. 将 Entity Framework、LINQ 和 Model-First 用于 Oracle 数据库

    目的 本教程介绍如何使用 Entity Framework.语言集成查询 (LINQ),以及如何对 Oracle 数据库使用 Model-First 以生成数据定义语言 (DDL) 脚本. 所需时间 ...

  5. Entity Framework 与 LINQ to SQL

    Entity Framework和LINQ to SQL到底有什么区别?这是一个很常见的问题.下面的表中简要罗列了两种技术的主要区别. LINQ to SQL Entity Framework 复杂度 ...

  6. Entity Framework 教程——Entity Framework中的实体类型

    Entity Framework中的实体类型 : 在之前的章节中我们介绍过从已有的数据库中创建EDM,它包含数据库中每个表所对应的实体.在EF 5.0/6.0中,存在POCO 实体和动态代理实体两种. ...

  7. 关于Entity Framework中的Attached报错相关解决方案的总结

    关于Entity Framework中的Attached报错的问题,我这里分为以下几种类型,每种类型我都给出相应的解决方案,希望能给大家带来一些的帮助,当然作为读者的您如果觉得有不同的意见或更好的方法 ...

  8. 关于Entity Framework中的Attached报错的完美解决方案终极版

    之前发表过一篇文章题为<关于Entity Framework中的Attached报错的完美解决方案>,那篇文章确实能解决单个实体在进行更新.删除时Attached的报错,注意我这里说的单个 ...

  9. 在Entity Framework中使用事务

    继续为想使用Entity Framework的朋友在前面探路,分享的东西虽然技术含量不高,但都是经过实践检验的. 在Entity Framework中使用事务很简单,将操作放在TransactionS ...

随机推荐

  1. Hbuilder开发app时生成ios要的mobileprovision和p12文件步骤.

    1.在MAC电脑.钥匙串串访问->证书助理->从证书颁发机构请求证书,创建一个证书为certSigningRequest文件 2.在Apple Developer中的Certificate ...

  2. bootstrap开发微票儿网站首页

    1.html代码 <!DOCTYPE html><html lang="en"><head> <meta charset="UT ...

  3. Linux命令(十一)gcc

    1. gcc -E 预处理 头文件展开 宏替换 2. gcc -S: 生成汇编指令 3. gcc - c: 生成二进制文件 4. gcc -I: (包含头文件) 5. gcc -o: 指定输出 6. ...

  4. 队列 Queue 与 生产者消费模型

    队列:先进先出 # from multiprocessing import Queue # Q = Queue(4) # Q.put('a') # Q.put('b') # Q.put('b') # ...

  5. SpringBoot系列: 使用MyBatis maven插件自动生成java代码

    ====================================pom.xml 文件====================================需要在 pom.xml 文件增加 m ...

  6. SQL Server进阶(十)事务和并发处理

    1 https://www.cnblogs.com/edisonchou/p/6129717.html

  7. redis的持久化方案

    Redis的高性能是由于其将所有数据都存储在了内存中,为了使Redis在重启之后仍能保证数据不丢失,需要将数据从内存中同步到硬盘中,这一过程就是持久化. Redis支持两种方式的持久化,一种是RDB方 ...

  8. pyqt5-QWidget-窗口状态(最大化最小化等)

    setWindowState(state)          #设置窗口状态 Qt.WindowNoState  无状态-正常状态 Qt.WindowMinimized     最小化 Qt.Wind ...

  9. JAVA进阶3

    间歇性混吃等死,持续性踌躇满志系列-------------第3天 1.局部内部类 局部内部类是指在类的方法中定义的内部类,它的作用范围也是在这个方法体内. class SellOutClass{ p ...

  10. (7)Java数据结构--集合map,set,list详解

    MAP,SET,LIST,等JAVA中集合解析(了解) - clam_clam的专栏 - CSDN博---有颜色, http://blog.csdn.net/clam_clam/article/det ...