Linq to SQL多条件where子句

时间:2012-04-25 20:16:10

标签: c# sql linq

目前我正在检索我的结果,如下所示:

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

但是现在我想在listview上面添加最多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子句?

3 个答案:

答案 0 :(得分:33)

没有理由不能通过多次调用.Where来过滤结果。由于LINQ to SQL的延迟执行,它将全部在一个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

答案 1 :(得分: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

答案 2 :(得分: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;
}