开发者

Linq dynamic queries for user search screens

I have a database that has a user search screen that is "dynamic" in that I can add additional search criteria on the fly based on what colum开发者_开发知识库ns are available in the particular view the search is based on and it will allow the user to use them immediately. Previously I had been using nettiers for this database, but now I am programming a new application against it using RIA and EntFramework 4 and LINQ.

I currently have 2 tables that are used for this, one that fills the combobox with the available search string patterns:

LastName LastName, FirstName Phone etc....

then I have an other table that splits those criteria out and is used in my nettiers algorithms. It works well, but I want to use LINQ..and it doesnt fit this model very well. Besides I think I can pare it down to just one table with linq...

using a format similar to this or something very close...

ID Criteria WhereClause 1 LastName 'Lastname Like '%{0}%'

now I know this wont fit specifically into a linq query..but I am trying to use a univeral syntax for clarity here...

the real where clause would look something like this: a=>a.LastName.Contains("{0}")

My first question is: Is that even possible to do? Feed a lambda in to a string and use it in a Linq Query?

My second question is: at one point when I was researching this before I found a linq syntax that had a prefix like it.LastName{0} and I appear to have tried using it because vestiges of it are still in my test databases...but I dont know recall where I read about it.

Is anyone doing this? I have done some searches and found similar occurances but they mostly have static fields that are optional, not exactly the way I am doing it...


As for your first question, you can do this using Dynamic Linq as described by Scott Gu here

var query = Northwind.Products.Where("Lastname LIKE "test%");


I'm not sure how detailed your dynamic query needs to be, but when I need to do dynamic queries, I create a class to represent filter values. Then I pass that class to a search method on my repository. If the value for a field is null then the query ignores it. If it has a value it adds the appropriate filter.

public class CustomerSearchCriteria{
    public string LastName { get; set; }
    public string FirstName { get; set; }
    public string PhoneName { get; set; }
}


public IEnumberable<Customer> Search(CustomerSearchCriteria criteria){
    var q = db.Customers();

    if(criteria.FirstName != null){
        q = q.Where(c=>c.FirstName.Contains(criteria.FirstName));
    }

    if(criteria.LastName!= null){
        q = q.Where(c=>c.LastName.Contains(criteria.LastName));
    }

    if(criteria.Phone!= null){
        q = q.Where(c=>c.Phone.Contains(criteria.Phone));
    }
    return q.AsEnumerable();
}
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜