Entity framework中LINQ的使用
一、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的使用的更多相关文章
- [转]在Entity Framework中使用LINQ语句分页
本文转自:http://diaosbook.com/Post/2012/9/21/linq-paging-in-entity-framework 我们知道,内存分页效率很低.并且,如果是WebForm ...
- 在Linq to sql 和 Entity framework 中使用lambda表达式实现left join
在Linq to sql 和 Entity framework 中使用lambda表达式实现left join 我们知道lambda表达式在Linq to sql 和 Entity framework ...
- [转]Entity Framework vs. LINQ to SQL
Entity Framework和LINQ to SQL到底有什么区别?这是一个很常见的问题.下面的表中简要罗列了两种技术的主要区别. LINQ to SQL Entity Framework 复杂度 ...
- 将 Entity Framework、LINQ 和 Model-First 用于 Oracle 数据库
目的 本教程介绍如何使用 Entity Framework.语言集成查询 (LINQ),以及如何对 Oracle 数据库使用 Model-First 以生成数据定义语言 (DDL) 脚本. 所需时间 ...
- Entity Framework 与 LINQ to SQL
Entity Framework和LINQ to SQL到底有什么区别?这是一个很常见的问题.下面的表中简要罗列了两种技术的主要区别. LINQ to SQL Entity Framework 复杂度 ...
- Entity Framework 教程——Entity Framework中的实体类型
Entity Framework中的实体类型 : 在之前的章节中我们介绍过从已有的数据库中创建EDM,它包含数据库中每个表所对应的实体.在EF 5.0/6.0中,存在POCO 实体和动态代理实体两种. ...
- 关于Entity Framework中的Attached报错相关解决方案的总结
关于Entity Framework中的Attached报错的问题,我这里分为以下几种类型,每种类型我都给出相应的解决方案,希望能给大家带来一些的帮助,当然作为读者的您如果觉得有不同的意见或更好的方法 ...
- 关于Entity Framework中的Attached报错的完美解决方案终极版
之前发表过一篇文章题为<关于Entity Framework中的Attached报错的完美解决方案>,那篇文章确实能解决单个实体在进行更新.删除时Attached的报错,注意我这里说的单个 ...
- 在Entity Framework中使用事务
继续为想使用Entity Framework的朋友在前面探路,分享的东西虽然技术含量不高,但都是经过实践检验的. 在Entity Framework中使用事务很简单,将操作放在TransactionS ...
随机推荐
- C# 主动发起请求代码
本文用于写代码是给提示 private string GetHW(string uri) { string returnStr = ""; HttpWebRequest hwReq ...
- 3.Zuul-过滤器
1.什么是Zuul? 路由+过滤器=Zuul,核心是一系列的过滤器 2.Zuul的过滤器: pre:可以在请求被路由之前调用 route:在路由请求时候被调用 post:在route和error过滤器 ...
- Shuttle 学习
见 http://blog.csdn.net/liu765023051/article/details/38521039
- mssql 数据库表行转列,列转行 比较经典
--行列互转 /******************************************************************************************** ...
- Ubuntu 18.04 设置开机启动脚本 rc.local systemd
ubuntu18.04不再使用initd管理系统,改用systemd. ubuntu-18.04不能像ubuntu14一样通过编辑rc.local来设置开机启动脚本,通过下列简单设置后,可以使rc.l ...
- HDU 1038(速度里程计算 **)
题意是已知车轮的直径,圈数和时间,求所行驶的里程和速度. 单位换算,代码如下: #include <bits/stdc++.h> using namespace std; const do ...
- 委托(Delegate)简介
1.什么是委托?是用来干什么的? 委托是一个类,它定义了方法的类型,使得可以将定义的方法当作另一个方法的参数来进行传递,这种将方法动态地赋给参数的做法,可以避免在程序中大量使用If-Else(Swit ...
- Spring AutoWire
AutoWire 有 ByType ,ByName两种主要使用方式 public class Boss { @Autowired private Car car; public Car getCar( ...
- 按科室统计 2.181222版本 关联查询join 不对
SQL: select t0.deptName, t0.deptId, t0.startTime, t0.endTime, IFNULL(t0.num,) as num0, IFNULL(t1.num ...
- HTTP 响应类型 ContentType 对照表
Ø 前言 1. 下面是 HTTP 响应类型 ContentType 的可选值,有备无患先保存一下.摘自:https://wiki.selfhtml.org/wiki/MIME-Type/%C3% ...