在实体框架核心和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吗?的主要内容,如果未能解决你的问题,请参考以下文章