是否可以使用Linq在同一IEnumerable中比较两个字段?

时间:2018-06-28 21:20:03

标签: c# linq

在研究这个问题时,我发现了许多比较两个不同列表的答案。那不是我的情况。我有一个带有多个字段的类的IEnumerable,我需要过滤同一列表中一个字段大于另一个字段的地方。

我可以设想这种类型的比较有很多用途,但是在此示例中,我将事情变得非常简单。

为了给您一个更好的上下文,这是一个用T-SQL制作的简单表。

T-SQL代码:

create table #GetMia1ASummaryBar (
    Id int not null identity(1,1),
    ShrCreditRate Float null,
    NonShrCreditRate Float null
);

insert into #GetMia1ASummaryBar(ShrCreditRate,NonShrCreditRate)
values (null,1.5),(2.5,0.75),(2,2),(1,null);

-- to see the entire table    
select * from #GetMia1ASummaryBar;

-- to filter where the first field is greater than the second
select * from #GetMia1ASummaryBar t where t.ShrCreditRate>t.NonShrCreditRate;

drop table #GetMia1ASummaryBar;

使用Linq,我希望能够轻松完成T-SQL中的工作:select * from #GetMia1ASummaryBar t where t.ShrCreditRate>t.NonShrCreditRate;

沿着这些行,我尝试了这个。

// select where first field is greater than second field
var list = repo.GetMia1ASummaryBar(campus)
           .Where(l => l.ShrCreditRate > l.NonShrCreditRate);

虽然我没有收到任何编译错误,但我没有收到应该至少应有一条记录的记录。

因此,

Id          ShrCreditRate          NonShrCreditRate
----------- ---------------------- ----------------------
1           NULL                   1.5
2           2.5                    0.75
3           2                      2
4           1                      NULL

我想过滤以接收此消息。

Id          ShrCreditRate          NonShrCreditRate
----------- ---------------------- ----------------------
2           2.5                    0.75

我实际上是在尝试避免创建一个由for-each循环填充的单独列表,这将是最后的选择。我要进行的Linq比较类型是否有简单的方法。

1 个答案:

答案 0 :(得分:1)

感谢发表评论的每个人。简而言之,这种语法确实有效。

// select where first field is greater than second field
var list = repo.GetMia1ASummaryBar(campus)
           .Where(l => l.ShrCreditRate > l.NonShrCreditRate);

列表为空的原因是由于具有过滤器的基础依赖性。我在集成测试中发现了这种意外行为,该行为再次显示了集成测试的价值。 (我的单元测试未发现意外行为。)