Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/265.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何将以下SQL语句转换为LINQ方法语法_C#_Sql Server_Linq_Entity Framework 6 - Fatal编程技术网

C# 如何将以下SQL语句转换为LINQ方法语法

C# 如何将以下SQL语句转换为LINQ方法语法,c#,sql-server,linq,entity-framework-6,C#,Sql Server,Linq,Entity Framework 6,我在使用EF6将下面的SQL语句转换为LINQ方面寻求帮助。我花了似乎永远都在看不同的例子,却没有发现任何有效的方法。我看过linqer没有成功我看过linqpad它没有将sql转换成linq 下面的查询返回的正是我在寻找的SQL格式的内容,目标是基于内部分组返回表的所有列,使用分组作为不同的查询,使用组的WHERE子句将记录集过滤为所需的内容,并在[CDRCALID]上加入内部分组仅返回[CDRCALID]匹配的记录 SELECT ct1.StartTime, ct1.CdrCallID, c

我在使用EF6将下面的SQL语句转换为LINQ方面寻求帮助。我花了似乎永远都在看不同的例子,却没有发现任何有效的方法。我看过linqer没有成功我看过linqpad它没有将sql转换成linq

下面的查询返回的正是我在寻找的SQL格式的内容,目标是基于内部分组返回表的所有列,使用分组作为不同的查询,使用组的WHERE子句将记录集过滤为所需的内容,并在[CDRCALID]上加入内部分组仅返回[CDRCALID]匹配的记录

SELECT ct1.StartTime, ct1.CdrCallID, ct1.CallingNumberId, ct1.CalledNumberId, ct1.ThreadSequence
FROM CallTransactions as ct1
join (select CdrCallID
      from CallTransactions as ct2 
      WHERE [StartTime] >= '10/1/2020 00:00:00 AM' AND [StartTime] <= '03/31/2021 00:00:00 AM' AND [CalledNumberId] = '1670589' OR [CallingNumberId] = '1670589' OR [DestinationNumberId] = '1670589' OR [TransferringNumberId] = '1670589' OR [KeyPartyNumberId] = '1670589'
      group by ct2.CdrCallID) ct2
on ct1.CdrCallID = ct2.CdrCallID
开始时间 CdrCallID 呼叫号码 被叫号码 螺纹序列 2020-11-02 12:49:34.007 995368-307-63751883929019 1670589 1658625 995368 2021-02-19 14:38:54.600 78900-050-63751893781085 1670589 1658625 78900 2020-10-27 09:58:15.007 704239-301-63751883392147 1663834 1667952 704239 2020-10-27 09:58:15.007 704239-301-63751883392147 1663834 1670589 704239 2020-10-27 09:57:14.007 704239-301-63751883392147 1663834 1667952 704239 2020-10-27 09:57:59.000 704239-301-63751883392147 1663834 1670589 704239 2020-11-02 10:15:06.007 497923-307-63751883688115 1663847 1670589 497923
我认为您的SQL中存在一些缺陷,实际上应该是这样的:

SELECT ct1.StartTime, ct1.CdrCallID, ct1.CallingNumberId, ct1.CalledNumberId, ct1.ThreadSequence 
FROM CallTransactions as ct1 
where exists 
(select *
    from CallTransactions as ct2 
     WHERE ct1.CdrCallID = ct2.CdrCallID and 
            (([StartTime] >= '20201001' AND [StartTime] <= '20210331') AND 
           ([CalledNumberId] = '1670589' OR 
           [CallingNumberId] = '1670589' OR 
           [DestinationNumberId] = '1670589' OR 
           [TransferringNumberId] = '1670589' OR 
           [KeyPartyNumberId] = '1670589'));
在Linq中,这就像:

var start = new DateTime(2020,10,1);
var end = new DateTime(2021,4,1);
var numberId = "1670589";
var callIDs = ctx.CallTransactions
    .Where(x => x.StartTime >= start && x.StartTime < end && 
        (x.CalledNumberId == numberId ||
         x.CallingNumberId == numberId ||
         x.DestinationNumberId == numberId ||
         x.TransferringNumberId == numberId ||
         x.KeyPartNumberId == numberId))
    .Select(x => x.CdrCallId);

var result = ctx.CallTransactions.Where(x => callIDs.Any(ci => ci.CdrCallId == x.CdrCallId)
   .Select(ct1 => new {ct1.StartTime, ct1.CdrCallID, ct1.CallingNumberId, ct1.CalledNumberId, ct1.ThreadSequence});
PS:你真的不需要把所有东西都转换成EF Linq。您也可以从Linq调用原始SQL

IQueryable<CallTransactions> items;
var start=new DateTime(2021,1,10);
var due=new DateTime(2021,3,31);

var result=items.Where(a=>a.StartTime>=start && a.StartTime<=due)
                .Where(a=>a.CalledNumberId = '1670589' || 
                          a.CallingNumberId = 1670589 || 
                          a.DestinationNumberId = 1670589 || 
                          a.TransferringNumberId = 1670589 ||
                          a.KeyPartyNumberId = '1670589')
                .Select(a=>new {
                    a.StartTime, 
                    a.CdrCallID, 
                    a.CallingNumberId, 
                    a.CalledNumberId, 
                    a.ThreadSequence
                });

我认为这不需要一个连接,一旦你过滤了集合,你就需要所有的行。

我不相信SQL正在返回你需要的东西,也许在你正在尝试的更小的子集上。你对所有这些都有把握吗?请您提供一些数据和所需的输出谢谢您的及时回复,我为我的格式糟糕的问题向大家道歉,这是我第一次在这里发布,我需要学习所有你们使用的酷技巧。。。。。