我想编写一个动态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;
}
我可以知道如何只有一个查询,以便我可以动态发送开始时间和错误时间来获得结果吗?
答案 0 :(得分: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);
}
答案 1 :(得分:0)
您可以使用PredicateBuilder动态构建谓词并与And()或()结合使用。 看看:http://www.albahari.com/nutshell/predicatebuilder.aspx