Simon
Simon

Reputation: 61

Linq to SQL - Ignore search parameters that are null or zero

I have a search form where the user can enter one to many parameters (Data, Status, Type, ID, Summary, Description) and leave the rest blank.

Here's my Linq to SQL code for my basic search. Is there a way to check each parameter within the Linq for zero, null or empty string?

List<RequestStatusModel> objRequestStatus = new List<RequestStatusModel>();
var query = from r in SimCareDB.Requests
            where r.CustomerID == 31       
            select (new RequestStatusModel
            {
                RequestID = r.RequestID,
                RequestTitle = r.RequestTitle,
                DateAdded = r.DateAdded.ToString(),
                DateChanged = r.DateChanged.ToString(),
                RequestStatusID = r.StatusID
            });

Thank you!

Upvotes: 6

Views: 1989

Answers (3)

Arthur Rey
Arthur Rey

Reputation: 3058

If you want to avoid all those ifs, you could do

List<RequestStatusModel> objRequestStatus = new List<RequestStatusModel>();
var query = from r in SimCareDB.Requests
            where (r.CustomerID == 31) &&
                  (!String.IsNullOrEmpty(id) ? r.RequestID == id : true) &&
                  (!String.IsNullOrEmpty(status) ? r.StatusID == status : true)
                  /* And so on */
            select (new RequestStatusModel
            {
                RequestID = r.RequestID,
                RequestTitle = r.RequestTitle,
                DateAdded = r.DateAdded.ToString(),
                DateChanged = r.DateChanged.ToString(),
                RequestStatusID = r.StatusID
            });

Upvotes: 0

Marco
Marco

Reputation: 23937

If it doesn't have to be in your linq statement you could just do it with classic if statements.

List<RequestStatusModel> objRequestStatus = new List<RequestStatusModel>();
var query = from r in SimCareDB.Requests
            where r.CustomerID == 31
            select (new RequestStatusModel
            {
               //...
            });

if(data != null) //Replace with additional checks, if neccessary
{
   query = query.where(x=> ...);
}

if(status != null) 
{
   query = query.where(x => ...)
}

Upvotes: 2

AndyC
AndyC

Reputation: 1335

If you want to only filter if certain criteria is passed, you should do something like this

var objRequestStatus = new List<RequestStatusModel>();
    var query = from r in SimCareDB.Requests
                where r.CustomerID == 31

if (String.IsNullOrEmpty(r.RequestID))
    objRequestStatus = objRequestStatus.Where(x => x.RequestID == r.RequestID);

if (String.IsNullOrEmpty(r.RequestTitle))
    objRequestStatus = objRequestStatus.Where(x => x.RequestTitle == r.RequestTitle);

//you other filters here

This sets up the expression to what you want based on which requests are passed

Upvotes: 0

Related Questions