Lamda表达式主从表数据提取

90e家 2021-04-15 01:50:27
主从表获取数据,比方说学生表、成绩表
成绩表里面的分数可以是A,B,C,D 也可以数字
我需要判断分数>90的学生有哪些
应该怎么处理
因为分数的定义为string类型,所以判断一致有问题,
无法通过!有没有对Lamda表达式比较擅长的,给指点指点!
...全文
2303 32 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
32 条回复
切换为时间正序
请发表友善的回复…
发表回复
极客诗人 2021-04-21
  • 打赏
  • 举报
回复
数据拿的#31 的 如下:
class Program
    {
        static void Main(string[] args)
        {
            int num = 0;
            DBTable db = new DBTable();
            var query = from b in db.ScoreList
                        join a in db.StudentList
                        on b.No equals a.No
                        where b.Score.Equals("A") ||(int.TryParse(b.Score,out num) && int.Parse(b.Score) > 90 ) || b.Subject == "数学"
                        select new
                        {
                            No = a.No,
                            Name = a.Name,
                            Subject = b.Subject,
                            Score = b.Score
                        };
            query.ToList().ForEach((x) =>
            {
                Console.WriteLine(x.No + "|" + x.Name + "|" + x.Subject + "|" + x.Score);
            });
           
            Console.ReadLine();
        }

        public class DBTable
        {
            public List<Student> StudentList { get; set; }
            public List<StudentScore> ScoreList { get; set; }

            public DBTable()
            {
                StudentList = new List<Student>();
                ScoreList = new List<StudentScore>();

                StudentList.Add(new Student() { No = "01", Name = "张三" });
                StudentList.Add(new Student() { No = "02", Name = "李四" });
                StudentList.Add(new Student() { No = "03", Name = "麻子" });

                ScoreList.Add(new StudentScore() { No = "01", Subject = "语文", Score = "99" });
                ScoreList.Add(new StudentScore() { No = "01", Subject = "数学", Score = "A" });
                ScoreList.Add(new StudentScore() { No = "02", Subject = "语文", Score = "93" });
                ScoreList.Add(new StudentScore() { No = "02", Subject = "数学", Score = "B" });
                ScoreList.Add(new StudentScore() { No = "03", Subject = "语文", Score = "89" });
                ScoreList.Add(new StudentScore() { No = "03", Subject = "数学", Score = "C" });
            }
        }

        public class Student
        {
            public string No { get; set; }
            public string Name { get; set; }
        }

        public class StudentScore
        {
            public string No { get; set; }
            public string Score { get; set; }
            public string Subject { get; set; }
        }
    }
yiyoyiyocc 2021-04-20
  • 打赏
  • 举报
回复
直接用sql不行么
morliz子轩 2021-04-16
  • 打赏
  • 举报
回复
引用 26 楼 90e家 的回复:
[quote=引用 25 楼 morliz子轩 的回复:]我去,你这问题,就有点难产了。 为啥数据结构,不用整型或浮点,分数搞成varchar? 这是个啥逻辑。
因为结果有字符的可能,我这只是个举例[/quote] 你这个问题需求,前身条件就是带着问号来的,又怎能求解要的答案。 我理解不了,计算分数怎么会可能是一个字符串值。 如果说,它本身就有可能会出现不能直接转换整型,就要先写一个方法,来做条件判断,并做值的转化处理。 再拿来做后面的逻辑加工。
90e家 2021-04-16
  • 打赏
  • 举报
回复
引用 25 楼 morliz子轩 的回复:
我去,你这问题,就有点难产了。 为啥数据结构,不用整型或浮点,分数搞成varchar? 这是个啥逻辑。
因为结果有字符的可能,我这只是个举例
morliz子轩 2021-04-16
  • 打赏
  • 举报
回复
我去,你这问题,就有点难产了。 为啥数据结构,不用整型或浮点,分数搞成varchar? 这是个啥逻辑。
90e家 2021-04-16
  • 打赏
  • 举报
回复
引用 23 楼 morliz子轩 的回复:
[quote=引用 20 楼 90e家 的回复:] 是的,但是lamda中string是用不了大于号的,会报错
那可以写成这样: int.Parse(p.[成绩]) > 90 转换成整行来判断。试下[/quote] int.Parse()在转换的时候报错,提示ef无法识别该函数,谢谢哈,这个也试过了,不行
morliz子轩 2021-04-16
  • 打赏
  • 举报
回复
引用 20 楼 90e家 的回复:
是的,但是lamda中string是用不了大于号的,会报错
那可以写成这样: int.Parse(p.[成绩]) > 90 转换成整行来判断。试下
90e家 2021-04-16
  • 打赏
  • 举报
回复
其实这个只是我举例罢了,本身是LIS里面的检查结果,有数值型和阴阳性两种结果,都存储在结果字段里面的,所以很头大啊
90e家 2021-04-16
  • 打赏
  • 举报
回复
引用 18 楼 morliz子轩 的回复:
[quote=引用 6 楼 90e家 的回复:]最简单的例子, 学生表 学生编号 学生姓名 01 张三 02 李四 成绩表 学生编号 科目 成绩 01 语文 90 01 数学 B 02 语文 99 02 数学 96 03 语文 A 成绩是string类型,我要成绩语文成绩>90 的人
引用 6 楼 90e家 的回复:
最简单的例子, 学生表 学生编号 学生姓名 01 张三 02 李四 成绩表 学生编号 科目 成绩 01 语文 90 01 数学 B 02 语文 99 02 数学 96 03 语文 A 成绩是string类型,我要成绩语文成绩>90 的人

using(DbContext db = new DbContext())
{
      var result = from p in db.[成绩表]
                          join a in db.[学生表] on p.[学生编号] equls a.[学生编号]
                          .where p.[科目] = "语文" and p.[成绩] > "90"
                          .select new { a.[学生姓名] }
                          .ToList();
}
是这么样的?[/quote] 是的,但是lamda中string是用不了大于号的,会报错
老王就是我 2021-04-16
  • 打赏
  • 举报
回复

select
(case chengji when chengji>90 or chengji =='A' then 90)
from table

大概这样,和lamda有啥关系?
morliz子轩 2021-04-16
  • 打赏
  • 举报
回复
引用 6 楼 90e家 的回复:
最简单的例子, 学生表 学生编号 学生姓名 01 张三 02 李四 成绩表 学生编号 科目 成绩 01 语文 90 01 数学 B 02 语文 99 02 数学 96 03 语文 A 成绩是string类型,我要成绩语文成绩>90 的人
引用 6 楼 90e家 的回复:
最简单的例子, 学生表 学生编号 学生姓名 01 张三 02 李四 成绩表 学生编号 科目 成绩 01 语文 90 01 数学 B 02 语文 99 02 数学 96 03 语文 A 成绩是string类型,我要成绩语文成绩>90 的人

using(DbContext db = new DbContext())
{
      var result = from p in db.[成绩表]
                          join a in db.[学生表] on p.[学生编号] equls a.[学生编号]
                          .where p.[科目] = "语文" and p.[成绩] > "90"
                          .select new { a.[学生姓名] }
                          .ToList();
}
是这么样的?
Mr Dang 2021-04-16
  • 打赏
  • 举报
回复

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            int num = 0;
            DBTable db = new DBTable();
            var query = from b in db.ScoreList
                        join a in db.StudentList
                        on b.No equals a.No
                        where int.TryParse(b.Score, out num)  && b.Subject=="语文"
                        select new
                        {
                            No=a.No,
                            Name = a.Name,
                            Subject=b.Subject,
                            Score=b.Score
                        };
            query.ToList().Where(x=>int.Parse(x.Score)>90).ToList().ForEach((x) => 
            {
                Console.WriteLine(x.No+"|"+x.Name+"|"+x.Subject+"|"+x.Score);
            });
            Console.ReadLine();
        }

        public class DBTable
        {
            public List<Student> StudentList { get; set; }
            public List<StudentScore> ScoreList { get; set; }

            public DBTable()
            {
                StudentList = new List<Student>();
                ScoreList = new List<StudentScore>();

                StudentList.Add(new Student() { No = "01", Name = "张三" });
                StudentList.Add(new Student() { No = "02", Name = "李四" });

                ScoreList.Add(new StudentScore() { No="01",Subject="语文",Score="91"});
                ScoreList.Add(new StudentScore() { No="01",Subject="数学",Score="B"});
                ScoreList.Add(new StudentScore() { No="02",Subject="语文",Score="89"});
                ScoreList.Add(new StudentScore() { No="02",Subject="数学",Score="86"});
                ScoreList.Add(new StudentScore() { No="03",Subject="语文",Score="A"});
            }
        }

        public class Student
        {
            public string No { get; set; }
            public string Name { get; set; }
        }

        public class StudentScore
        {
            public string No { get; set; }
            public string Score { get; set; }
            public string Subject { get; set; }
        }
    }
}
morliz子轩 2021-04-16
  • 打赏
  • 举报
回复
那你就是在逻辑层面,考虑问题不周了。 先处理逻辑上的判断事务: 条件1: if( 检查项 = 血常规 或者 生化的检查 ……) { 把表中的值取出来做软化完成最终的判断要求; } 条件2: if( 检查项 = 尿检 || 检查项 = 手工项目 ……) { 把表中的值取出来做软化完成最终的判断要求; } 先以项目检查类型入手,做取值的判断,也就是说要整理好哪些项目会产生什么数值类型。 再以这个类型去LINQ或Lamda来输出要的结果。 你以为一个方法层就能完成处理,这不可能的呀。
weixin_42066565 2021-04-16
  • 打赏
  • 举报
回复
回帖test
90e家 2021-04-16
  • 打赏
  • 举报
回复
引用 27 楼 morliz子轩 的回复:
[quote=引用 26 楼 90e家 的回复:][quote=引用 25 楼 morliz子轩 的回复:]我去,你这问题,就有点难产了。 为啥数据结构,不用整型或浮点,分数搞成varchar? 这是个啥逻辑。
因为结果有字符的可能,我这只是个举例[/quote] 你这个问题需求,前身条件就是带着问号来的,又怎能求解要的答案。 我理解不了,计算分数怎么会可能是一个字符串值。 如果说,它本身就有可能会出现不能直接转换整型,就要先写一个方法,来做条件判断,并做值的转化处理。 再拿来做后面的逻辑加工。[/quote] 比想的复杂,我那个检查结果,一般血常规、生化的检查结果都是数值型的,但是尿检、手工项目检查结果是不固定的,-+ - 1+2+3+ 还有文字型,很多,所以不能纯粹的用整型
  • 打赏
  • 举报
回复
为什么要转成int?估计你这样执行的时候会报错

int num=0;
var query=from a in db.学生表
                  join b in db.成绩表
                  on a.学生编号 equals b.学生编号
                  where b.成绩.CompareTo("90") >= 0
                  select new
                  {
                      name=a.学生姓名
                  };
执行看下,因为我现在的项目就是这样使用的,跟你的需求差不多
90e家 2021-04-15
  • 打赏
  • 举报
回复
引用 14 楼 手在键盘敲很轻 的回复:
你确定我的方式不行?不妨运行试试看
试过了不行的
Mr Dang 2021-04-15
  • 打赏
  • 举报
回复

int num=0;
var query=from a in db.学生表
                  join b in db.成绩表
                  on a.学生编号 equals b.学生编号
                  where int.TryParse(b.成绩, out num) && num>90
                  select new
                  {
                      name=a.学生姓名
                  };
  • 打赏
  • 举报
回复
你确定我的方式不行?不妨运行试试看
  • 打赏
  • 举报
回复
大于90,那成绩是A算不算
加载更多回复(12)

111,094

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • AIGC Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧