0

startTime と errorTime の 2 つの時間枠に基づいて「where」条件をチェックする動的 linq クエリを作成したいと考えています。現在のコードはこちら、

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;

}

開始時刻とエラー時刻を動的に送信して結果を取得できるように、クエリを 1 つだけ持つ方法を教えてください。

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 に答える