![](/img/trans.png)
[英]Translate t-sql query to LINQ (left join with subquery/nested right join)
[英]Translate SQL Query to LINQ with left join and let
我一直在尝试将此查询转换为linq,但是我没有得到。 我将.NET Framework 4.5与Code First一起使用。
DECLARE @FECHAINICIAL DATETIME, @FECHAFINAL DATETIME
DECLARE @CANAL VARCHAR(300)
SET @FECHAINICIAL = '2019-07-01 17:00'
SET @FECHAFINAL = '2019-08-07 18:00'
SET @CANAL = 'channel';
WITH CATEGORIA AS(
SELECT DISTINCT sm_categoria FROM [DataBase].[dbo].[SM_App] WHERE sm_canal = @CANAL
)
SELECT
CATEGORIA.sm_categoria,
COUNT(CASE WHEN sm_red = 'Facebook' THEN 1 END) as Facebook,
COUNT(CASE WHEN sm_red = 'Twitter' THEN 1 END) as Twitter,
COUNT(CASE WHEN sm_red = 'Instagram' THEN 1 END) as Instagram
FROM
CATEGORIA
LEFT JOIN [DataBase].[dbo].[SM_App] ON CATEGORIA.sm_categoria = SM_App.sm_categoria
AND sm_canal like 'channel'
AND sm_fecha BETWEEN @FECHAINICIAL AND @FECHAFINAL
group by CATEGORIA.sm_categoria
实体框架不支持CTE。 但是我想在您的情况下不需要CTE .Group by足够您的情况了,而且您不需要左连接。 如果您仍然想使用CTE(例如您的CATEGORIA),可以考虑上述答案
DateTime fechaInicial= new DateTime(2019, 7, 1, 17, 0, 0);
DateTime fechaFinal= new DateTime(2019, 7, 1, 17, 0, 0);
string canal = "channel";
var result = (from cat in ctx.CATEGORIAS
where cat.sm_canal == canal && cat.sm_fecha >= fechaInicial && cat.sm_fecha <= fechaFinal
group cat by cat.sm_categoria into g
select new YourCustomClass {
sm_categoria= g.Key,
Facebook = g.Where(p=> p.sm_red =="Facebook").Count(),
Twitter = g.Where(p=> p.sm_red =="Twitter").Count(),
Instagram = g.Where(p=> p.sm_red =="Instagram").Count()
}).ToList();
public class YourCustomClass {
public string sm_categoria { get; set; }
public int Facebook { get; set; }
public int Twitter { get; set; }
public int Instagram { get; set; }
}
实际上,您可以在实体框架中运行sql。
this.context.Database.SqlQuery(sqlstatement,params);
下面的示例将调用一个存储过程,该存储过程返回数据,这似乎是您要完成的工作。
context.Database.SqlQuery<myEntityType>(
"storedprocname @FECHAINICIAL, @FECHAFINAL, @CANAL",
new SqlParameter("FECHAINICIAL", new DateTime(2019, 7, 1, 17, 0, 0)),
new SqlParameter("FECHAFINAL", new DateTime(2019, 8, 7, 18, 0, 0)),
new SqlParameter("CANAL", "channel")
);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.