Linq to Entity ile bir tablo içerisindeki tüm alanlarda arama

Code

Son yazılar

Linq to Entity ile bir tablo içerisindeki tüm alanlarda arama
Murat Mehmet 0
05.10.2014 Pazar 16:30
shadow
        public static IEnumerable<T> Search<T>(this IEnumerable<T> query, string text, bool splitSearch = true) where T : class
        {
            var properties = typeof(T).GetProperties(BindingFlags.DeclaredOnly |
                                           BindingFlags.Public |
                                           BindingFlags.Instance)
                                           .Where(a => !a.PropertyType.IsAbstract && a.PropertyType == typeof(String))
                                           .Select(p => p.Name).ToArray();
            return Search(query, properties, text);

        }
        public static IEnumerable<T> Search<T>(this IEnumerable<T> query, string[] propertyNames, string text, bool splitSearch = true)
        {
            if (query is IQueryable<T>)
                return Search(query.AsQueryable(), propertyNames, text, splitSearch);
            if (propertyNames.Length == 0)
                throw new Exception("No properties found to search");
            PropertyInfo[] properties = null;
            var texts = splitSearch ? text.Split(' ') : new[] { text };
            return query.Where(i =>
            {
                if (properties == null)
                    properties = i.GetType().GetProperties().Where(p => !p.PropertyType.IsAbstract && p.PropertyType == typeof(String)).ToArray();
                return propertyNames.Any(pn =>
                    texts.Any(t =>
                    {
                        var prop = properties.FirstOrDefault(p => p.Name == pn);
                        if (prop == null) return false;
                        return ((string) prop
                            .GetValue(i, null))
                            .IndexOf(t, StringComparison.CurrentCultureIgnoreCase) > -1;
                    }));
            });

        }
        public static IQueryable<T> Search<T>(this IQueryable<T> query, string[] propertyNames, string text, bool splitSearch = true)
        {
            var q = query.AsQueryable();
            if (propertyNames.Length == 0)
                throw new Exception("No properties found to search");
            Expression whereExpression = null;
            ParameterExpression table = Expression.Parameter(typeof(T), "");
            var texts = splitSearch ? text.Split(' ') : new[] { text };
            foreach (var prop in propertyNames)
            {
                foreach (var s in texts)
                {
                    Expression column = Expression.PropertyOrField(table, prop);
                    Expression valueExpression = Expression.Convert(Expression.Constant(s), column.Type);
                    Expression containsExpression = Expression.Call(column, "Contains", null, valueExpression);
                    whereExpression = whereExpression == null
                        ? containsExpression
                        : Expression.OrElse(whereExpression, containsExpression);
                }
            }
            var lambda = Expression.Lambda<Func<T, bool>>(whereExpression, new[] { table });
            Type[] exprArgTypes = { q.ElementType };
            MethodCallExpression methodCall = Expression.Call(typeof(Queryable),
                "Where",
                exprArgTypes,
                q.Expression,
                lambda);
            return q.Provider.CreateQuery<T>(methodCall);
        }

 

Yazar

Murat Mehmet
Murat Mehmet

Yaklaşık 10 yılını kod yazmaya adamış, ama hala öğrenecek çook şeyin olduğunun farkında olan biriyim. Çok yanlış yapmışım, meğer bu hayatta tasarımcı olmak varmış :P

Yorumlar

İlk yorumu siz girin.

Yorum Yazın