C# LINQ中的案例查询相当于sql查询

C# LINQ中的案例查询相当于sql查询,c#,sql,linq,C#,Sql,Linq,我有一个包含调用者、被调用者fiels的数据集,我需要一些LINQ查询来操作这个数据集,相当于这个sql查询 SELECT CASE WHEN caller < callee THEN callee ELSE caller END AS caller1, CASE WHEN caller < callee THEN caller ELSE callee END AS caller2, Count(*)

我有一个包含调用者、被调用者fiels的数据集,我需要一些LINQ查询来操作这个数据集,相当于这个sql查询

SELECT CASE
     WHEN caller < callee THEN callee
     ELSE caller
   END      AS caller1,
   CASE
     WHEN caller < callee THEN caller
     ELSE callee
   END      AS caller2,
   Count(*) AS [Count]
    FROM   YourTable
   GROUP  BY CASE
        WHEN caller < callee THEN callee
        ELSE caller
      END,
      CASE
        WHEN caller < callee THEN caller
        ELSE callee
      END 
选择案例
当调用者<被调用者,则调用者
其他来电者
以呼叫者的身份结束1,
案例
当调用者<被调用者,则调用者
其他被叫人
以呼叫者的身份结束2,
计数(*)为[计数]
从你的桌子上
分组
当调用者<被调用者,则调用者
其他来电者
完,,
案例
当调用者<被调用者,则调用者
其他被叫人
结束
选择案例
当调用者<被调用者,则调用者
其他来电者
以呼叫者的身份结束1
翻译成

caller1 = x.caller < x.callee ? x.callee : x.caller
caller1=x.caller
这就是你想要的吗

DataSet dataSet = new DataSet();
DataTable dataTable = new DataTable("dataTable");

dataTable.Columns.Add("caller", typeof(String));
dataTable.Columns.Add("callee", typeof(String));

dataTable.Rows.Add("999", "888");
dataTable.Rows.Add("888", "999");
dataTable.Rows.Add("999", "555");
dataTable.Rows.Add("555", "333");
dataTable.Rows.Add("555", "999");

dataSet.Tables.Add(dataTable);

string filter = "999";

var result = dataSet.Tables["dataTable"].Select().Select(dr =>
    new
    {
        caller1 = StringComparer.CurrentCultureIgnoreCase.Compare(dr["caller"], dr["callee"]) < 0 ? dr["callee"] : dr["caller"],
        caller2 = StringComparer.CurrentCultureIgnoreCase.Compare(dr["caller"], dr["callee"]) < 0 ? dr["caller"] : dr["callee"]
    })
        .Where(dr => String.IsNullOrEmpty(filter) || dr.caller1 == filter || dr.caller2 == filter)
        .GroupBy(drg => new { drg.caller1, drg.caller2 } )
        .Select(drg => new { drg.Key.caller1, drg.Key.caller2, count = drg.Count() });
DataSet数据集=新数据集();
DataTable=新的DataTable(“DataTable”);
Add(“调用者”,typeof(String));
Add(“被调用方”,typeof(String));
dataTable.Rows.Add(“999”、“888”);
dataTable.Rows.Add(“888”、“999”);
dataTable.Rows.Add(“999”、“555”);
dataTable.Rows.Add(“555”、“333”);
dataTable.Rows.Add(“555”、“999”);
dataSet.Tables.Add(dataTable);
字符串过滤器=“999”;
var result=dataSet.Tables[“dataTable”].Select().Select(dr=>
新的
{
caller1=StringComparer.CurrentCultureInoRecase.Compare(dr[“caller”]、dr[“callee”])<0?dr[“callee”]:dr[“caller”],
caller2=StringComparer.CurrentCultureInoRecase.Compare(dr[“调用者”]、dr[“被调用者”])<0?dr[“调用者”]:dr[“被调用者”]
})
.Where(dr=>String.IsNullOrEmpty(filter)| | dr.caller1==filter | | dr.caller2==filter)
.GroupBy(drg=>new{drg.caller1,drg.caller2})
.Select(drg=>new{drg.Key.caller1,drg.Key.caller2,count=drg.count()});

这就是您要寻找的,请注意范围变量的使用,它有助于我们重用case语句并简化LINQ查询

var query = from y in YourTable
            //place the result of the case statement into a range variable so we can reuse it for the grouping
            let caller1 = y.caller < y.callee ? y.callee : y.caller
            let caller2 = y.caller < y.callee ? y.caller : y.callee
            //group the results
            group y by new { caller1, caller2 } into grouping
            select new
            {            
                //get the range variables from the grouping key
                grouping.Key.caller1,
                grouping.Key.caller2,
                //get the count of the grouping
                Count = grouping.Count(),
            };
var query=从表中的y开始
//将case语句的结果放入一个范围变量中,这样我们就可以在分组时重用它
让caller1=y.caller
数据集
的意思是?我指的是包含数据表的.net数据集。调用者和被调用者都是字符串类型HI如果我只需要获取编号为999的调用者详细信息,我如何在该查询中实现您想在数据表级别过滤结果的方式(即,只有“999”的调用者,而不是“999”的被调用者)或者是否要从结果中删除数据(即caller1为“999”)?caller1和caller2都可以是999I已为您的筛选方案编辑了答案。请注意,我假设缺少过滤器会返回所有结果。如果这不正确,请从where子句中删除
String.IsNullOrEmpty(filter)|
,以不返回任何结果。如果我在datatable中添加了日期列,并希望在结果集中获取最大和最小日期。可能吗?
var query = from y in YourTable
            //place the result of the case statement into a range variable so we can reuse it for the grouping
            let caller1 = y.caller < y.callee ? y.callee : y.caller
            let caller2 = y.caller < y.callee ? y.caller : y.callee
            //group the results
            group y by new { caller1, caller2 } into grouping
            select new
            {            
                //get the range variables from the grouping key
                grouping.Key.caller1,
                grouping.Key.caller2,
                //get the count of the grouping
                Count = grouping.Count(),
            };