C# LINQ中的案例查询相当于sql查询
我有一个包含调用者、被调用者fiels的数据集,我需要一些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(*)
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(),
};