【问题标题】:Translate SQL Query to LINQ with left join and let使用左连接将 SQL 查询转换为 LINQ 并让
【发布时间】:2019-12-17 16:22:43
【问题描述】:

几天来,我一直在尝试将此查询翻译为 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 

【问题讨论】:

  • 如果您使用的是实体框架,您可能需要提及这一点。如果您正在使用其他东西(例如 Linq2SQL),请提及。 “LINQ”是一种语言特性,而不是一种数据库访问技术(EF 和 Linq2SQL 也是如此,它们都使用 LINQ)。

标签: c# .net linq asp.net-mvc-5


【解决方案1】:

实体框架不支持 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; }
}

【讨论】:

  • 感谢您的回答,我正在测试您的建议,但是尽管复制了您的建议,但我无法返回正确的信息。但是,在我看来,它接近我所需要的。问候。
【解决方案2】:

实际上有一种方法可以在实体框架内运行 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")

);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多