c# - LINQ <Where> 在 C# 中有条件?

标签 c# linq

有没有办法将 LINQ WHERE 与条件 bool 值一起使用,如果为假则跳过。我的代码示例如下:-

var filters = ListResponse.filter.Where(a => a.FLRefID == EvtID).ToList();
foreach(var tofilter in filters)
{
    if (tofilter == null)
        continue;
    // The value in tofilter can be empty
    bool bFilterID = string.IsNullOrEmpty(tofilter.FLEventID);
    bool bFilterText = string.IsNullOrEmpty(tofilter.FLText);
    bool bFilterSource = string.IsNullOrEmpty(tofilter.FLSource);
    bool bFilterLevel = string.IsNullOrEmpty(tofilter.FLLevel);

    // Here in LINQ where I want to filter
    // EventDetails is List of Event Viewer Collection.
    var logs = EventDetails.Where(ax => bFilterID ? (ax.EventID == tofilter.FLEventID) | bFilterText ? (ax.EventMessage.Contains(tofilter.FLText)) | bFilterSource ? (ax.EventSourceName == tofilter.FLSource) | bFilterLevel ? (ax.Level == tofilter.FLLevel));
    string json = JsonConvert.SerializeObject(logs);
}

假设 USER 选择了他们想要过滤的 ID=1, SourceName=Application其余的都是空的。如果 bFilterID = true 如何在 LINQ 中添加条件然后 ax.EventID == tofilter.FLEventID将被使用。如果为 False(用户未设置),它将跳过条件。过滤器可以是动态的,但必须至少有 1 个条件才能从 USER 设置。

我实际上不确定我要搜索的关键字是什么,因为我不知道它是否存在。

更新:
我有来自 Mik 的测试答案和来自 npo 的两个答案。
> 18-03-2019 10:30:17.876405 [INFO] Time taken NPO 1: 00:00:00.0705490
> 18-03-2019 10:30:17.889374 [INFO] Time taken NPO 2: 00:00:00.0123487
> 18-03-2019 10:30:17.903334 [INFO] Time taken MIK:   00:00:00.0146780
> 
> 18-03-2019 10:30:17.947219 [INFO] Time taken NPO 1: 00:00:00.0435493
> 18-03-2019 10:30:17.977139 [INFO] Time taken NPO 2: 00:00:00.0297257
> 18-03-2019 10:30:17.981127 [INFO] Time taken MIK:   00:00:00.0036274
> 
> 18-03-2019 10:30:28.536724 [INFO] Time taken NPO 1: 00:00:00.2011405
> 18-03-2019 10:30:28.596560 [INFO] Time taken NPO 2: 00:00:00.0594285
> 18-03-2019 10:30:28.634464 [INFO] Time taken MIK:   00:00:00.0376055

最佳答案

这就是我的做法:

IQueryable<EventDetails> res = EventDetails;

if( !string.IsNullOrEmpty(tofilter.FLEventID) )
  res = res.Where(ax => ax.EventID == tofilter.FLEventID); 

if( !string.IsNullOrEmpty(tofilter.FLText) )
  res = res.Where(ax => ax.EventMessage.Contains(tofilter.FLText));

if( !string.IsNullOrEmpty(tofilter.FLSource) )
  res = res.Where(ax => ax.EventSourceName == tofilter.FLSource);

if( !string.IsNullOrEmpty(tofilter.FLLevel) )
  res = res.Where(ax => ax.Level == tofilter.FLLevel);

string json = JsonConvert.SerializeObject(res);

它会生成多个子查询,但我认为不存在性能问题,而且这更具可读性。

顺便说一下,我把你的 IsNullOrEmpty 倒过来了测试,因为在您的代码中您只过滤空字符串...

关于c# - LINQ <Where> 在 C# 中有条件?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55179963/

相关文章:

c# - Unity Survival Shooter Enemy 不受伤害 - Android

c# - 启动多个线程,为什么必须等待?

c# - 从程序资源中检索图像

c# - "Specified cast is not valid"将字符串数组转换为 int 数组时

c# - 什么时候应该使用 TaskCompletionSource<T>?

c# - Entity Framework SaveChangesAsync 不更新数据库

C# 对字符串数字进行加/减

c# - 在 LINQ 语句中使用部分类属性

c# - 在 LINQ 中列出列

c# - 我怎样才能从 Linq 的 TakeWhile 中再拿 1 件元素?