【问题标题】:How to ignore 'where' and 'order by' condition if the column is null in LINQ如果 LINQ 中的列为空,如何忽略“where”和“order by”条件
【发布时间】:2012-04-11 15:31:27
【问题描述】:

我有交易对象列表,并希望根据用户当前打开的视图按特定条件对它们进行排序。

我遇到的问题是,为了在 where 子句中添加条件,首先我需要检查它是否为空,以防止空指针异常。这会导致列 null 的记录被过滤掉(我想将它们包含在列表的底部)。

如果该列为空,我如何修改查询以忽略条件(位置和排序依据)并仍将它们附加到结果集中?

这是一个示例查询:

transactions = transactions
                    .Where(t => t.PurchaseRequisition != null && 
                    t.Award != null && t.PurchaseRequisition.RequisitionedBy != null)
                    .OrderBy(t => t.Award.ContractNumber).
                    ThenBy(t => ToSafeString(t.Award.ContractNumber)).
                    ThenBy(t => ToSafeString(t.PurchaseRequisition.RequisitionedBy.FullName));


public string ToSafeString(string s)
{
    return s ?? String.Empty;
}

// 我希望将 PurchaseRequisition 或 Award 为空的记录附加到结果集中。

【问题讨论】:

  • 如何只订购结果集的一部分?我想你需要两个查询。

标签: c# sql linq


【解决方案1】:

您只需修改您的OrderByThenBy 子句:

.OrderBy(t => t.Award == null || t.Award.ContractNumber == null)
.ThenBy(t => t.Award == null ? "" : ToSafeString(t.Award.ContractNumber))
.ThenBy(t => t.PurchaseRequisition == null ? "" 
             : ToSafeString(t.PurchaseRequisition.RequisitionedBy.FullName));

现在您可以完全删除Where 子句了。

【讨论】:

  • 你能解释一下 OrderBy 参数是如何工作的吗?生成的 SQL 可能是什么样子?我从没见过这样用的。
  • 它似乎工作了,你能解释一下first order by condition的作用吗?顺便说一句,它看起来会将带有空列的记录放在顶部。
  • @SteveMallory:我不确定 SQL 会是什么样子,您只需检查一下即可。
  • @joonho:第一个OrderBy 只是将AwardnullContractNumber 视为空值相同。如果你想要nulls 结尾,请改用OrderByDescending
猜你喜欢
  • 2022-11-28
  • 1970-01-01
  • 2018-12-23
  • 2022-08-02
  • 1970-01-01
  • 2021-10-01
  • 2011-07-29
  • 2011-09-13
  • 1970-01-01
相关资源
最近更新 更多