10

現在、次のように結果を取得しています。

public List<claim> GetClaims()
{
    return _db.claims.OrderBy(cl => cl.claimId).ToList();
}

しかし今、私はリストビューの上のフィルターに基づいて最大8つの条件付きwhere句を追加しようとしています。

だから私はになりました:

public List<claim> GetFilteredClaims(string submissionId, string claimId,
                                     string organization, string status,
                                     string filterFromDate, string filterToDate,
                                     string region, string approver)
{
    return _db.claims.Where(cl => cl.submissionId == 5).ToList();
}

各フィルターをチェックして、値が含まれている場合にのみwhere句を追加するにはどうすればよいですか?

4

3 に答える 3

34

何度か呼び出して結果をフィルタリングし続けることができない理由はありません.Where。LINQ to SQL の遅延実行のため、すべて 1 つの SQL ステートメントで実行されます。

public List<claim> GetFilteredClaims(string submissionId, string claimId,
                                     string organization, string status,
                                     string filterFromDate, string filterToDate,
                                     string region, string approver)
{
    IQueryable<claim> filteredClaims = _db.claims;

    if (!string.IsNullOrWhiteSpace(submissionId))
    {
        filteredClaims = filteredClaims.Where(claim => claim.submissionId == submissionId);
    }

    if (!string.IsNullOrWhiteSpace(claimId))
    {
        filteredClaims = filteredClaims.Where(claim => claim.claimId == claimId);
    }

    ...

    return filteredClaims.ToList();
}

OR 条件を追加する必要がある場合は、PredicateBuilderを参照してください。

于 2012-04-25T22:14:45.750 に答える
0

LINQKIT http://www.albahari.com/nutshell/linqkit.aspxをご覧ください。 述語を作成できます。

これは私が使用するコードですが、上記のドキュメントを読んでください。述語を使用すると、一連の OR または AND またはそれらの組み合わせを連鎖させることができます。

private static IEnumerable<SurveyResult> filterData(string firstName, string lastName, List<SurveyResult> results)
{
    var predicate = PredicateBuilder.True<SurveyResult>();


    IEnumerable<SurveyResult> a;
    if (excludeBadData)

    if (firstName != string.Empty)
    {
        predicate = predicate.And(p => p.User.FirstName.ToLower().Contains(firstName.ToLower()));
    }

    if (lastName != string.Empty)
    {
        predicate = predicate.And(p => p.User.LastName.ToLower().Contains(lastName.ToLower()));
    }


    a = from r in results.AsQueryable().Where(predicate) select r;
    return a;
}
于 2012-04-25T22:50:42.707 に答える
0

次のように、各フィルター オプションを OR null 条件でグループ化し、それらをすべて AND で連結することができます。

public List<claim> GetFilteredClaims(string submissionId, string claimId, string organization, string status, string filterFromDate, string filterToDate, string region, string approver)
    {
        return _db.claims
            .Where(cl => (cl.submissionId == submissionId || submissionId == null)
            && (cl.claimId == claimId || claimId == null)
            && so on and so on... ).ToList();

    }

したがって、submissionId == null および claimId == "123" の場合、claimId の結果のみがフィルタリングされます。nullそれぞれを空の文字列または「値なし」条件に置き換えることができます。

于 2012-04-25T20:30:02.380 に答える