【问题标题】:Linq optional parameters queryLinq 可选参数查询
【发布时间】:2020-02-11 19:40:33
【问题描述】:

我正在制作一个搜索表单,用于查询我的数据库以根据表单上填写的内容显示结果。唯一必填字段是我工作的日期。所有其他字段都是可选的,如果未填写可选字段,则它不应该是查询的一部分。这是我写的代码:

            var queryable = context.TransactionJournal.Where(s => s.TransactionDateTime <= transactionDate)
                .Where(s => Region == null || Region == s.AcquirerID)
                .Where(s => MCC == null || MCC == s.MerchantCategoryCode)
                .Where(s => MerchantID == null || MerchantID.Contains(s.MerchantID))
                .Where(s => TxnCurrency == null || TxnCurrency.Contains(s.Currency))
                .Where(s => TerminalID == null || TerminalID.Contains(s.TerminalID))
                .Where(s => TxnAmount.ToString() == null || TxnAmount==(s.TransactionAmount))
                .Where(s => BIN == null || BIN.Contains(s.Bin))
                .Where(s => MsgType == null || MsgType.Contains(s.MessageType))
                .Where(s => MaskedPan == null || MaskedPan.Contains(s.PANM))
                .Where(s => ProcessingCode == null || ProcessingCode.Contains(s.ProcessingCode))
                .Where(s => ClearPan == null || ClearPan.Contains(s.PAN))
                .Where(s => ResponseCode == null || ResponseCode.Contains(s.ResponseCode))
                .Where(s => AuthorizationCode == null || AuthorizationCode.Contains(s.AuthorizationCode))
                .Where(s => EntryMode == null || EntryMode.Contains(s.PosEntryMode))
                .AsQueryable();

不幸的是,它无法正常工作。谁能告诉我我错过了什么或者是否有更好的方法来写这个?

【问题讨论】:

  • .Where((s => Region == null || Region == s.AcquirerID) && (MCC == null || MCC == s.MerchantCategoryCode) && ....)
  • 这对我来说看起来不错。尽管您不能链接 .Where 语句并使用 &amp;&amp; 代替它们,但它在功能上与您现在所拥有的相同。最重要的是:“it does not work correctly”不是问题陈述。请包括输入和预期输出。
  • @Igor 很抱歉,查询在输出中根本没有显示任何结果
  • @Adil15 - 我明白,但您需要提供输入和预期输出。您没有得到输出的最可能原因是 Where 子句中的其中一个条件正在评估为 false 而您只是没有抓住它(毕竟您是人类,可能会犯错误或没有注意到某些事情) .但是,如果您没有带有样本输入的样本数据,那么没有人可以帮助您发现该错误。
  • @Adil15 通过删除更多语句尝试“调试”它。你会发现其中一条语句返回 false

标签: c# sql entity-framework linq


【解决方案1】:

听取 cmets 的建议,检查每一行,发现哪一行评估为假。这解决了我的问题。

【讨论】:

    【解决方案2】:

    我认为你能做的最好的事情是先检查是否应该应用条件,然后过滤列表。

    使用您提供的代码的示例。

                 var queryable = context.TransactionJournal.Where(s => s.TransactionDateTime <= transactionDate);
    
                 if (!string.IsNullOrEmpty(your_objet.Region) 
                 {
                    var queryable = queryable.Where(x=>x.Region == your_objet.Region).AsQueryable();
                 }
    
                 if (!string.IsNullOrEmpty(your_objet.MCC) 
                 {
                    var queryable = queryable.Where(x=>x.MCC == your_objet.MCC).AsQueryable();
                 }
    

    第一行是整个列表,然后检查表单中的所有参数并对其进行评估,如果有值则将过滤器应用于列表。

    最后你的列表会被过滤掉。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-05-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-19
      • 2020-12-22
      • 2021-02-02
      • 1970-01-01
      相关资源
      最近更新 更多