user3239719
user3239719

Reputation: 31

How to write a generic LINQ query for filtering of data based on first name middle name and last name

I have one table which contains employees records like first , middle, last name. I have 3 textboxes for entering all these. Now on .net side I want to write a single LINQ query to filter data based on first name middle name and last name. Any of these 3 fields can be blank. Is these any way to write a single generic LINQ query?

Upvotes: 2

Views: 925

Answers (4)

Emre Kabaoglu
Emre Kabaoglu

Reputation: 13146

Try something like that;

    public List<Employee> RetrieveEmployees(string firstName, string lastName, string middleName)
    {
        var query = from employees in context.Employees
            where (string.IsNullOrEmpty(firstName) || employees.FirstName == firstName) &&
                  (string.IsNullOrEmpty(lastName) || employees.LastName == lastName) &&
                  (string.IsNullOrEmpty(middleName) || employees.MiddleName == middleName)
        select employees;

        return query.ToList();
    }

Upvotes: 0

Dan Dohotaru
Dan Dohotaru

Reputation: 3089

when iterating just verify if the criteria in use has value

var criteria = new 
{
    FirstName = default(string),
    MiddleName = default(string),
    LastName = "Doe",
};

var query = from record in Context()
            where !string.IsNullOrEmpty(criteria.FirstName) 
                    && record.FirstName == criteria.FirstName
                || !string.IsNullOrEmpty(criteria.MiddleName) 
                    && record.MiddleName == criteria.MiddleName
                || !string.IsNullOrEmpty(criteria.LastName) 
                    && record.LastName == criteria.LastName
            select record;

Upvotes: 0

benPearce
benPearce

Reputation: 38343

public IList<Employee> GetEmployees(string first, string middle, string last)
{
    var query = context.Employees.AsQueryable();
    if (!string.IsNullOrWhiteSpace(first))
    {
        query = query.Where(x => x.FirstName == first);
    }
    if (!string.IsNullOrWhiteSpace(middle))
    {
        query = query.Where(x => x.MiddleName == middle);
    }
    if (!string.IsNullOrWhiteSpace(last))
    {
        query = query.Where(x => x.LastName == last);
    }

    return query.Select(x => 
                    new Employee 
                    { 
                        FullName = string.Join(" ", new string[] { x.FirstName, x.MiddleName, x.LastName}.Where(y => !string.IsNullOrWhiteSpace(y)))
                    })
                .ToList();
}

Upvotes: 4

jignesh patel
jignesh patel

Reputation: 982

You can write one linq query with or condition like bellow

_context.tablename.where(p=>p.firstName.contains(txtFirstName) || p.middleName.contains(txtMiddleName) || p.lastName.contains(txtLastName)).ToList();

Change tablename with you database table in above linq query

Upvotes: 0

Related Questions