linq和lambda表达式,已经使用join和groupjoin
时间:2020-08-01
本文章向大家介绍linq和lambda表达式,已经使用join和groupjoin,主要包括linq和lambda表达式,已经使用join和groupjoin使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
在net core 3.1中使用两个表进行联合查询
// 内连接(lambda表达式又称点标试)join方法的参数,第一个是要join的对象(下面是students),第二个是外部的(下面的teacher)key,第三个参数内部(下面是students)的key,第四个是结果(自己定义) var result = await _dbContext.teachers.Join(_dbContext.students, t => t.Id, s => s.TeacherId, (t, s) => new TeacherAndStudentDto { TeacherId = t.Id, TeacherName = t.Name, StudentId = s.Id, StudentName = s.Name }).ToListAsync();
// 内连接(linq表达式又称查询表达式) var result = await (from s in _dbContext.students join t in _dbContext.teachers on s.TeacherId equals t.Id select new TeacherAndStudentDto { TeacherId = t.Id, TeacherName = t.Name, StudentId = s.Id, StudentName = s.Name }).ToListAsync();
//左连接(已左表为基础表(下面就是已students为基础表),匹配条件,如果有就加上,没有就已默认值添上)和sql中left join类似 var result = await (from s in _dbContext.students join t in _dbContext.teachers on s.TeacherId equals t.Id into newTeacher from nt in newTeacher.DefaultIfEmpty() //nt的类型为Teacher select new TeacherAndStudentDto { TeacherId = nt.Id, TeacherName = nt.Name, StudentId = s.Id, StudentName = s.Name }).ToListAsync();
最后我用groupjoin 先用下面的方法,可以查到数据
//左连接 var students = await _dbContext.students.ToListAsync(); var teachers = await _dbContext.teachers.ToListAsync(); var result = students.GroupJoin(teachers, s => s.TeacherId, t => t.Id, //调用的是 IEnumerable<TResult> GroupJoin<>这个方法,是已studens为基础表,Teacher表附加到上面 (s, t) => new TeacherAndStudentDto // t为IEnumerable<Teacher> { StudentId = s.Id, StudentName = s.Name, TeacherId = s.TeacherId, TeacherName = t.FirstOrDefault(c => c.Id == s.TeacherId) == null ? null : t.FirstOrDefault(c => c.Id == s.TeacherId).Name } ).ToList();
然后我换一个方法
var result = await _dbContext.students.GroupJoin(_dbContext.teachers, s => s.TeacherId, t => t.Id, //调用IQueryable<TResult> GroupJoin<>这个方法 (s, t) => new TeacherAndStudentDto { StudentId = s.Id, StudentName = s.Name, TeacherId = t.FirstOrDefault(c => c.Id == s.TeacherId) == null ? 0 : t.FirstOrDefault(c => c.Id == s.TeacherId).Id, TeacherName = t.FirstOrDefault(c => c.Id == s.TeacherId) == null ? null : t.FirstOrDefault(c => c.Id == s.TeacherId).Name }).ToListAsync();
然后就报错(暂时没有找到问题所在)
An unhandled exception occurred while processing the request. InvalidOperationException: Processing of the LINQ expression 'DbSet<Student> .GroupJoin( outer: DbSet<Teacher>, inner: s => s.TeacherId, outerKeySelector: t => t.Id, innerKeySelector: (s, t) => new TeacherAndStudentDto{ StudentName = s.Name, TeacherName = t .FirstOrDefault(c => c.Id == s.TeacherId).Name } )' by 'NavigationExpandingExpressionVisitor' failed. This may indicate either a bug or a limitation in EF Core. See https://go.microsoft.com/fwlink/?linkid=2101433 for more detailed information. Microsoft.EntityFrameworkCore.Query.Internal.NavigationExpandingExpressionVisitor.VisitMethodCall(MethodCallExpression methodCallExpression)
一些相关的类
public class TeacherAndStudentDto { public int TeacherId { get; set; } public string TeacherName { get; set; } public string StudentName { get; set; } public int StudentId { get; set; } } public class Teacher { [Key] public int Id { get; set; } public string Name { get; set; } /// <summary> /// 所教科目 /// </summary> public string Subject { get; set; } public GenderEnum GenderEnum { get; set; } public DateTime Birthday { get; set; } public double Hegiht { get; set; } public double? Weight { get; set; } } public class Student { [Key] public int Id { get; set; } public string Name { get; set; } public DateTime? Birthday { get; set; } /// <summary> /// 学号 /// </summary> public string Numerber { get; set; } /// <summary> /// 分数 /// </summary> public int? Score { get; set; } /// <summary> /// 年级 /// </summary> public string Grade { get; set; } public GenderEnum? GenderEnum { get; set; } public double Hegiht { get; set; } public double? Weight { get; set; } public int TeacherId { get; set; } } public enum GenderEnum { [Description("女")] Female=0, [Description("男")] Male =1, } public class EFCoreDbContext : DbContext { public EFCoreDbContext(DbContextOptions<EFCoreDbContext> options) : base(options) { } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { //如果appseting.json中没有配置数据库连接,会读取这里的配置 if (!optionsBuilder.IsConfigured) { optionsBuilder.UseSqlServer("Server=.;Data Source=(local);uid=sa;pwd=xxx;DataBase=xxx"); } base.OnConfiguring(optionsBuilder); } protected override void OnModelCreating(ModelBuilder modelBuilder) { //Fluent API } public DbSet<Teacher> teachers { get; set; } public DbSet<Student> students { get; set; } }
这个问题还要摸索一下,以后解决吧,又要学习go语言了
原文地址:https://www.cnblogs.com/carlpeng/p/13415436.html
- 建立可扩展的silverlight 应用框架 step-5
- 安卓 iOS 版双双更新!还带来一大波小游戏
- 建立可扩展的silverlight 应用框架 step-4
- 全自动驾驶,吹牛容易实现难!有90%的人都不了解这些细节
- .NET4.0下web应用程序用UrlRewriter.dll重写无后缀路径
- Silverlight中摄像头的运用—part2
- 区块链小白投资入门操作指南(上)
- 《我的WCF之旅》博文系列汇总
- 网站出现“Service Unavailable”提示该如何解决
- Silverlight 4 中摄像头的运用—part1
- Silverlight 4 中摄像头的运用—part1
- Silverlight 4 中数据绑定发生的变化
- 未来3年 人工智能如何影响法律行业?5位权威专家给出趋势
- silverlight.js详解.
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- ignite:一个漂亮的多用户SS/SSR面板
- FreshRSS:开源免费的RSS阅读器
- 使用snap快速安装RocketChat你的聊天服务器
- CuteOne:一款基于Python3的OneDrive多网盘挂载程序,带会员/同步等功能
- Baidu Sitemap Generator在PHP7无法生成XML的解决方法
- MFC实现的Socket通信
- 128-在线翻译
- C语言CGI编程二 - 编写cmd后门
- android 获取视频第一帧作为缩略图的方法
- Flutter利用注解生成可自定义的路由的实现
- Android实现随意拖动View效果的实例代码
- Kotlin的枚举与异常示例详解
- Android自定义View的使用及其原理知识点总结
- Android中Window的管理深入讲解
- Android UI绘制流程及原理详解