有没有办法将 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/