C# 使用左连接和let将SQL查询转换为LINQ

C# 使用左连接和let将SQL查询转换为LINQ,c#,.net,linq,asp.net-mvc-5,C#,.net,Linq,Asp.net Mvc 5,几天来,我一直试图将这个查询翻译成linq,但我不明白。我首先使用带有代码的.NETFramework 4.5 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 = 'chann

几天来,我一直试图将这个查询翻译成linq,但我不明白。我首先使用带有代码的.NETFramework 4.5

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 

实际上,有一种方法可以在实体框架内运行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")
context.Database.SqlQuery(
“storedprocname@FECHAINICIAL、@FECHAFINAL、@CANAL”,
新的SqlParameter(“FECHAINICIAL”,新的日期时间(2019,7,1,17,0,0)),
新的SqlParameter(“FECHAFINAL”,新的日期时间(2019,8,7,18,0,0)),
新的SqlParameter(“运河”、“通道”)

))

实际上有一种方法可以在实体框架内运行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")
context.Database.SqlQuery(
“storedprocname@FECHAINICIAL、@FECHAFINAL、@CANAL”,
新的SqlParameter(“FECHAINICIAL”,新的日期时间(2019,7,1,17,0,0)),
新的SqlParameter(“FECHAFINAL”,新的日期时间(2019,8,7,18,0,0)),
新的SqlParameter(“运河”、“通道”)

))

实体框架中不支持CTE。但我想你的情况下不需要CTE。分组方式就足够了,而且你也不需要左加入。如果您仍然想使用CTE(如您的案例中的类别),您可以考虑上述答案< /P>
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; }
}
DateTime fechaInicial=新的日期时间(2019,7,1,17,0,0);
DateTime fechaFinal=新的日期时间(2019,7,1,17,0,0);
字符串canal=“channel”;
var结果=(来自ctx.CATEGORIAS中的cat
其中cat.sm_canal==canal和cat.sm_fecha>=fechainical和cat.sm_fecha p.sm_red==“Facebook”).Count(),
Twitter=g.Where(p=>p.sm_red==“Twitter”).Count(),
Instagram=g.Where(p=>p.sm_red==“Instagram”).Count()
}).ToList();
公共类{
公共字符串sm_categoria{get;set;}
public int{get;set;}
公共int Twitter{get;set;}
公共int Instagram{get;set;}
}

实体框架中不支持CTE。但我想你的情况下不需要CTE。分组方式就足够了,而且你也不需要左加入。如果您仍然想使用CTE(如您的案例中的类别),您可以考虑上述答案< /P>
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; }
}
DateTime fechaInicial=新的日期时间(2019,7,1,17,0,0);
DateTime fechaFinal=新的日期时间(2019,7,1,17,0,0);
字符串canal=“channel”;
var结果=(来自ctx.CATEGORIAS中的cat
其中cat.sm_canal==canal和cat.sm_fecha>=fechainical和cat.sm_fecha p.sm_red==“Facebook”).Count(),
Twitter=g.Where(p=>p.sm_red==“Twitter”).Count(),
Instagram=g.Where(p=>p.sm_red==“Instagram”).Count()
}).ToList();
公共类{
公共字符串sm_categoria{get;set;}
public int{get;set;}
公共int Twitter{get;set;}
公共int Instagram{get;set;}
}

如果您使用的是实体框架,您可能需要提到这一点。如果您使用的是其他东西(比如Linq2SQL),请提及它。“LINQ”是一种语言特性,而不是一种数据库访问技术(EF和Linq2SQL都使用LINQ)。如果您使用的是实体框架,您可能需要提到这一点。如果您使用的是其他东西(比如Linq2SQL),请提及它。“LINQ”是一种语言功能,而不是数据库访问技术(EF和Linq2SQL都使用LINQ)。谢谢你的回答,我正在测试你的建议,但是我无法带回正确的信息,尽管复制了你的建议。然而,在我看来,这是接近我需要的。您好。谢谢您的回答,我正在测试您的建议,但是我无法带回正确的信息,尽管复制了您的建议。然而,在我看来,这是接近我需要的。问候语。