在实体框架核心和linq中查询时可以写case吗?

Posted

技术标签:

【中文标题】在实体框架核心和linq中查询时可以写case吗?【英文标题】:Can I write case when query in entity framework core and linq? 【发布时间】:2020-06-22 09:54:36 【问题描述】:

我的查询如下,(postgresql)

  SELECT split_part(grp.agerange, '*',2) as age_range,
         round(sum(salary)) AS total
  FROM
   (
       SELECT salary,
              CASE
                  WHEN(date_part('year', age(birth_date)) >  0  AND date_part('year', age(birth_date)) <= 8)   THEN  '0 - 8 age'
                  WHEN(date_part('year', age(birth_date)) >  8  AND date_part('year', age(birth_date)) <= 16)   THEN '8 - 16 age'
                  WHEN(date_part('year', age(birth_date)) >  16  AND date_part('year', age(birth_date)) <= 24)   THEN '16 - 24 age'
                  WHEN(date_part('year', age(birth_date)) >  24)  THEN '24 < age'   ELSE 'Unknown'
               END as agerange
       FROM sde.employee
    ) grp
  GROUP BY grp.agerange
  ORDER BY grp.agerange;

那么我可以使用 linq 在实体框架核心 3.0 Employee 模型中创建查询吗?

public class Employee
   public string Id get;set;
   public string Name get;set;
   public decimal Salary get;set;
   public DateTime? BirthDate get;set;

从我的数据库上下文中:

var grouped = _context.Employees.Group(????

Birthdate 是 Nullable 类型。

【问题讨论】:

【参考方案1】:

您可以只使用条件运算符 ? 或 Select 语句中的 if 语句,然后按该结果分组......

var grouped = _context.Employees
    .Select(e => new  AgeRange = e.birth_date.Year > 24 ? "24 < age" : etc.);
    .Group(e => e.AgeRange);

【讨论】:

不支持客户端 GroupBy。 (EF核心3.0版本) 它不应该是客户端...显示您的完整查询,您是否在 group by 之前做一个物化运算符,即 ToList 或其他什么?

以上是关于在实体框架核心和linq中查询时可以写case吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用实体框架和 linq 编写此 sql 查询

实体框架 Linq 查询:.Where 链 vs &&

实体框架/Linq to SQL:跳过和采取

实体框架 linq 查询 Include() 多个子实体

LINQ 实体框架查询在 EF Core 中不起作用,引发异常

实体框架/LINQ/SQL 与实体框架/LINQ/MYSQL