Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.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# 有条件的选择_C#_Sql Server_Linq_Tsql_Lambda - Fatal编程技术网

C# 有条件的选择

C# 有条件的选择,c#,sql-server,linq,tsql,lambda,C#,Sql Server,Linq,Tsql,Lambda,我有一个列表中的值: List1 ID groupID testNo 1 123 0 2 653 1 3 776 6 4 653 0 我想编写一个T-Sql或linq或lambda表达式,这样每当有重复的表达式时,它都应该选择有值的表达式=0 我使用这个表达式,但它基本上没有给出我想要的结果 var list2 = list1.GroupBy(x => x.testNo).Select(y =&g

我有一个列表中的值:

List1
ID    groupID   testNo
1     123       0
2     653       1
3     776       6
4     653       0
我想编写一个T-Sql或linq或lambda表达式,这样每当有重复的表达式时,它都应该选择有值的表达式=0

我使用这个表达式,但它基本上没有给出我想要的结果

 var list2 = list1.GroupBy(x => x.testNo).Select(y => y.First());

我如何才能获得结果,以便使用testNo 1和其余记录选择groupID 653?

您可以采取几种方法。我不知道他们是否有充分的证据。一种方法是在
testNo
上执行
OrderBy
,这样带有非零
testNo
的项将出现在带有0的项之前

var list2 = list1.Orderby(y => y.testNo).GroupBy(x => x.testNo).Select(z => z.FirstOrDefault());
如果您可以保证
testNo=0
只对重复出现,那么最简单的方法就是使用where

var list2 = list1.Where(x => x.testNo > 0).First();

这将为您提供所需的结果:

var list2 = list1.GroupBy(x => x.groupID)
                 .Select(x => list1.Single(item => item.groupID == x.Key
                              && item.testNo == x.Max(y => y.testNo)))
                 .ToList();

基本上,按
groupID
分组,然后从原始
list1
中选择与不同的
groupID
匹配并具有该
groupID
的最大值的
testNo
的每个项目,是否也可以有三份副本或仅重复?不,仅重复。您的意思是“每当有重复时”groupID它应该选择一个带有testNo的=0'? 如果是,请编辑您的问题以澄清
 var result = list.GroupBy(x => x.groupID).Select(g => g.Count() == 1 ? g.First() : g.First(x => x.testNo != 0));