ASP.NET search form - dynamic Linq to SQL?

前端 未结 3 1405
自闭症患者
自闭症患者 2021-02-10 04:27

I have a search form that allows users to search on several different fields in several different ways. Here is an example of my code.

var claims = from c in db.         


        
相关标签:
3条回答
  • 2021-02-10 05:23

    You could make a dictionary of your possible predicates:

    Dictionary<string, Func<string, Expression<Func<Claim, bool>>>> map = new Dictionary<string, Func<string, Expression<Func<Claim, bool>>>>() {
        { "StartsWith", t => c => c.companyFileID.StartsWith(t) },
        { "Equals",     t => c => c.companyFileID == t },
        { "Contains",   t => c => c.companyFileID.Contains(t) }
    };
    

    Which could be used like this:

    var search = ddlSearchField.Text;
    var text = txtSearchBox.Text;
    
    var claims = from c in db.Claims select c;
    
    Func<string, Expression<Func<Claim, bool>>> predicate = null;
    if(dict.TryGetValue(search, out predicate))
        claims = claims.Where(predicate(text));
    
    0 讨论(0)
  • 2021-02-10 05:24

    You could refactor some parts of the code by creating an extension method. Something like that :

    static class QueryableExtensions
    {
        private static MethodInfo StringContainsMethod;
        private static MethodInfo StringStartsWithMethod;
    
        static QueryableExtensions()
        {
            Type[] singleStringParam = new[] {typeof(string)};
            StringContainsMethod = typeof(string).GetMethod("Contains", singleStringParam);
            StringStartsWithMethod = typeof(string).GetMethod("StartsWith", singleStringParam);
        }
    
        public static IQueryable<T> AppendTextFilter<T>(this IQueryable<T> queryable, Expression<Func<T, string>> memberSelector, string condition, string value)
        {
            Expression expression = null;
            switch (condition)
            {
                case "StartsWith":
                    expression = Expression.Call(
                                    memberSelector.Body,
                                    StringStartsWithMethod,
                                    Expression.Constant(value));
                    break;
    
                case "Equals":
                    expression = Expression.Equal(
                                    memberSelector.Body,
                                    Expression.Constant(value));
                    break;
    
                case "Contains":
                    expression = Expression.Call(
                                    memberSelector.Body,
                                    StringContainsMethod,
                                    Expression.Constant(value));
                    break;
    
                default:
                    throw new NotSupportedException(string.Format("'{0}' is not a supported condition", condition));
            }
    
            var lambda = Expression.Lambda<Func<T, bool>>(
                            expression,
                            memberSelector.Parameters);
            return queryable.Where(lambda);
        }
    }
    

    You could then use it like that :

    var claims = db.Claims
                 .AppendTextFilter(c => c.companyFileID, ddlSearchField.Text, txtSearchBox.Text)
                 .AppendTextFilter(c => c.someOtherProperty, ddlOtherSearchField.Text, txtOtherSearchBox.Text)
                 ...;
    
    0 讨论(0)
  • 2021-02-10 05:28

    Have you tried dynamic LINQ? It allows you to build string-based query statements similar to a SQL WHERE clause.

    http://weblogs.asp.net/scottgu/archive/2008/01/07/dynamic-linq-part-1-using-the-linq-dynamic-query-library.aspx

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