【问题标题】:LINQ query needed using a conditional operand in the WHERE clause在 WHERE 子句中使用条件操作数需要 LINQ 查询
【发布时间】:2017-05-19 21:53:35
【问题描述】:

我在编写一个在 where 子句中使用条件操作数的 LINQ 语句时遇到问题,我在该站点中查看了类似的问题,但没有任何运气。我确信有更好的方法来表达这个查询。中的值XXX是确定对象中哪个字段用于比较的结果,下面解释。

以下是我想要完成的:

var paymentReceivedAmt = (from registerEntry in RegisterEntries
    where registerEntry.TransactionType != null
    && registerEntry.TransactionType.Id.SubsystemCode == "A"
    && registerEntry.Receipt != null
    && registerEntry.PostDate != null
    && XXX >= lastInvoicedDate
    select registerEntry.TransactionAmount.GetValueOrDefault(0)).Sum();

XXX =

if registerEntry.AddedDate = registerEntry.PostDate
    registerEntry.AddedDate
else
    registerEntry.PostDate

registerEntry.AddedDateregisterEntry.PostDate 的值是 DateTime 类型,但是在比较时我只需要比较日期而不是时间

有人知道怎么做吗?

【问题讨论】:

  • msdn 有很多很好的示例:code.msdn.microsoft.com/101-LINQ-Samples-3fb9811b
  • 您的意思是使用赋值而不是相等吗? if registerEntry.AddedDate = registerEntry.PostDateif registerEntry.AddedDate == registerEntry.PostDate 不同(注意双等号)

标签: c# linq comparison-operators operands


【解决方案1】:

为什么不将registerEntry.PostDate 用于XXX?如果等于registerEntry.AddedDate,还不如用它简化整个事情

var paymentReceivedAmt = (from registerEntry in RegisterEntries
    where registerEntry.TransactionType != null
    && registerEntry.TransactionType.Id.SubsystemCode == "A"
    && registerEntry.Receipt != null
    && registerEntry.PostDate != null
    && registerEntry.PostDate >= lastInvoicedDate
    select registerEntry.TransactionAmount.GetValueOrDefault(0)).Sum();

【讨论】:

  • 感谢您的帮助。我想我忘了提到,如果 AdditionalDate 与 PostDate 的值相同(仅日期值),那么我需要将两个值中最早的值与发票日期进行比较。 PostDate 是 DateTime 类型,但是这些值的所有时间将始终设置为 00:00:00,我无法更改代码以包含实际时间,而不会对应用程序的其余部分产生严重影响。再次感谢!!!
  • @ScottChappa - 如果AddedDatePostDate 具有相同的值,它们是相同的日期,没有一个比另一个更旧。如果您的模型在 DateTime 上具有 null 的概念,您应该使用可空的 - DateTime?
【解决方案2】:

根据您使用的 LINQ 提供程序,您可以尝试ternary operator

var paymentReceivedAmt = (from registerEntry in RegisterEntries
    where registerEntry.TransactionType != null
    && registerEntry.TransactionType.Id.SubsystemCode == "A"
    && registerEntry.Receipt != null
    && registerEntry.PostDate != null
    && (registerEntry.AddedDate == registerEntry.PostDate
            ? registerEntry.AddedDate
            : registerEntry.PostDate) >= lastInvoicedDate
    select registerEntry.TransactionAmount.GetValueOrDefault(0)).Sum();

【讨论】:

  • 就是这样!我正在考虑一个三元解决方案,但不确定如何表达它。非常感谢您的帮助!!!
猜你喜欢
  • 1970-01-01
  • 2018-08-14
  • 1970-01-01
  • 2010-10-24
  • 1970-01-01
  • 1970-01-01
  • 2023-03-27
  • 1970-01-01
  • 2020-12-31
相关资源
最近更新 更多