Linq to SQL多个条件的where子句

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子句?


请看这里的答案:https://dev59.com/9V_Va4cB1Zd3GeqPQy6l#8841339 - Jon Crowell
3个回答

34

只需多次调用.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


只是想说谢谢你的回答。这对我解决一个问题帮助很大。 - Grasshopper
+1 for PredicateBuilder - 这确实是最灵活的方法 - Simon_Weaver

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 替换为空字符串或任何您的“无值”条件。


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;
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接