Linq dynamic queries for user search screens

两盒软妹~` 提交于 2019-12-19 10:24:40

问题


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 columns 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...


回答1:


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%");



回答2:


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


来源:https://stackoverflow.com/questions/5539270/linq-dynamic-queries-for-user-search-screens

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!