Linq to SQL multiple conditional where clauses

后端 未结 3 1442
北恋
北恋 2020-12-01 19:39

At the moment I am retrieving my results as follows :

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


        
相关标签:
3条回答
  • 2020-12-01 19:43

    There is no reason why you can't just keep filtering the results by calling .Where several times. Because of the deferred execution of LINQ to SQL it will all be executed in one SQL statement:

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

    If you will ever need to add OR conditions, you could take a look at PredicateBuilder.

    0 讨论(0)
  • 2020-12-01 19:46

    Take a look at LINQKIT http://www.albahari.com/nutshell/linqkit.aspx It will allow you to build predicate

    Here is a code that I use but read the documentation above. The predicate will allow you to chain up a bunch of OR or AND or combination of it.

    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;
    }
    
    0 讨论(0)
  • 2020-12-01 20:08

    You could group each filter option with an OR null condition, and chain them all together with AND, like so:

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

    So if submissionId == null and claimId == "123", it would only filter the results on claimId. You could replace each null with an empty string or whatever your "no value" condition is.

    0 讨论(0)
提交回复
热议问题