0

我想编写一个动态 linq 查询,它根据两个时间框架 startTime 和 errorTime 检查“where”条件。现在的代码在这里,

IQueryable<LogFormat> errorLines = null;
if (!string.IsNullOrEmpty(errorStartTime) && !string.IsNullOrEmpty(errorTime))
{
    var sTime = DateTime.Parse(errorStartTime);
    var eTime = DateTime.Parse(errorTime);
    errorLines = from errorLine in File
                 where
                     (errorLine.DateTime >= sTime && errorLine.DateTime <= eTime) &&
                     (
                     errorLine.Level == "ERR"
                     || errorLine.Level == "WARN"
                     )
                 select errorLine;
}
else if (!string.IsNullOrEmpty(errorStartTime))
{
    var sTime = DateTime.Parse(errorStartTime);
    errorLines = from errorLine in File
                 where
                     errorLine.DateTime >= sTime
                     &&
                     (
                     errorLine.Level == "ERR"
                     || errorLine.Level == "WARN"

                     )
                 select errorLine;

}
else if (!string.IsNullOrEmpty(errorTime))
{
    var eTime = DateTime.Parse(errorTime);

    errorLines = from errorLine in File
                 where
                     errorLine.DateTime <= eTime
                     &&
                     (
                     errorLine.Level == "ERR"
                     || errorLine.Level == "WARN"
                   )
                 select errorLine;

}
else
{   
    errorLines = from errorLine in File
                 where
                     errorLine.Level == "ERR"
                     || errorLine.Level == "WARN"


                 select errorLine;

}

我可以知道如何只进行一个查询,以便我可以动态发送开始时间和错误时间以获取结果吗?

4

2 回答 2

2

where您可以根据条件多次调用该子句来使其动态化:

var errorLines = File.Where(e => e.Level == "ERR" 
                              || e.Level == "WARN");                   

if (!string.IsNullOrEmpty(errorStartTime))
{
     var sTime = DateTime.Parse(errorStartTime);
     errorLines = errorLines.Where(e => e.DateTime >= sTime);
}

if (!string.IsNullOrEmpty(errorTime))
{
    var eTime = DateTime.Parse(errorTime);
    errorLines = errorLines.Where(e => e.DateTime <= eTime);
}
于 2012-10-31T02:40:31.643 回答
0

您可以在使用 PredicateBuilder 时动态构建谓词并与 And() Or() 组合。看看:http ://www.albahari.com/nutshell/predicatebuilder.aspx

于 2012-10-31T10:41:06.783 回答