1、对普通集合和DbSet调用的Where方法,虽然用起来一样,但是“转到定义”后看到的是不同的方法。
2、普通集合的版本(IEnumerable)是在内存中过滤(客户端评估),而IQueryable版本则是把查询操作翻译成SQL语句(服务器端评估)。
1、IQueryable books = ctx.Books;
books.Where(b => b.Price > 1.1)
2、IEnumerable books = ctx.Books;
books.Where(b => b.Price > 1.1)
using Microsoft.EntityFrameworkCore;
using Microsoft.EntityFrameworkCore.Query;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace EF6Demon
{
public class ModelsResponsitory : IProvider
{
private MyDbContext db = new MyDbContext();
public MyDbContext Db
{
get { return db; }
set { db = value; }
}
public void AddActualData(List<ActualData> actualData)
{
db.ActualDatas.AddRangeAsync(actualData);
db.SaveChangesAsync();
}
public List<ActualData> GetActualData()
{
//IQueryable<ActualData> actualData = db.ActualDatas.Where(a=>a.Id>10);
//return actualData;
IEnumerable<ActualData> actualData1 = db.ActualDatas;
//IEnumerable<TSource> IOrderedEnumerable<TSource> OrderByDescending 全部取出,在内存中比较Where(a => a.Id > 10)
actualData1.Where(a => a.Id > 10).OrderByDescending(i => i.Id).Take(20);
//IQueryable<TSource> Where IOrderedQueryable<TSource> OrderByDescending, 给服务器发sql语句 Where(a => a.Id > 10)
//加上toList 把数据全部取回本地, 不占用带宽
IQueryable<ActualData> actualData =db.ActualDatas;
return actualData.Where(a => a.Id > 10).OrderByDescending(i => i.Id).Take(20).ToList();
}
public IIncludableQueryable<NodeClass, IEnumerable<Variable>> GetAllVariable()
{
return db.NodeClasses.
Include(n => n.ModbusNodes.Where(nodes => nodes.NodeClassId == 1))
.ThenInclude(m => m.ModbusGroups.Where(groups => groups.ModbusNodeId == 1))
.ThenInclude(gp => gp.Variables.Where(v => v.ModbusGroupId == 1));
}
}
}