как выполнить поиск с помощью star (*) в LINQ

#c# #linq

#c# #linq

Вопрос:

Я хочу выполнить поиск с помощью *. У меня есть

  <asp:TextBox runat="server" Width="500" Height="20" ID="tbInfo"></asp:TextBox>
  

метод поиска: когда я ищу без звезды *, это обычный поиск, но когда я задаю запрос LINQ star *, например tbInfo.Contains()

Пример:

 I set in textbox: Michael - 1 result, 
I set in textbox: Michael* - 20 results
  

Я надеюсь, что кто-нибудь меня поймет. 10x

Комментарии:

1. Пожалуйста, поделитесь фактическим кодом C #. На данный момент неясно, что вы делаете из вопроса.

2. вы хотите получить результат из списка?

Ответ №1:

Вам придется сделать некоторое кодирование самостоятельно.

Пример запроса:

 var q = (from c in db.Customers
         where c.CompanyName.Contains(name)
         select c)
        .ToList();
  

Приведенный выше пример всегда будет искать совпадение в любом месте CompanyName
. Но вам нужно предоставить своим пользователям немного больше контроля над методом
сопоставления, разрешив им указывать символы подстановки в
начале или в конце текста для сопоставления. Это означает, что вам остается
динамически создавать свой запрос на основе наличия и расположения
символов подстановки.

 using System;
using System.Collections.Generic;
using System.Data;
using System.Data.Objects;
using System.Data.Objects.DataClasses;
using System.Linq;
using System.Linq.Expressions;
using System.Reflection;

    public static class LinqExtensions
    {
        public static IQueryable<TSource> WhereLike<TSource>(
            this IQueryable<TSource> source,
            Expression<Func<TSource, string>> valueSelector,
            string value,
            char wildcard)
        {
            return source.Where(BuildLikeExpression(valueSelector, value, wildcard));
        }

        public static Expression<Func<TElement, bool>> BuildLikeExpression<TElement>(
            Expression<Func<TElement, string>> valueSelector,
            string value,
            char wildcard)
        {
            if (valueSelector == null)
                throw new ArgumentNullException("valueSelector");

            var method = GetLikeMethod(value, wildcard);

            value = value.Trim(wildcard);
            var body = Expression.Call(valueSelector.Body, method, Expression.Constant(value));

            var parameter = valueSelector.Parameters.Single();
            return Expression.Lambda<Func<TElement, bool>>(body, parameter);
        }

        private static MethodInfo GetLikeMethod(string value, char wildcard)
        {
            var methodName = "Contains";

            var textLength = value.Length;
            value = value.TrimEnd(wildcard);
            if (textLength > value.Length)
            {
                methodName = "StartsWith";
                textLength = value.Length;
            }

            value = value.TrimStart(wildcard);
            if (textLength > value.Length)
            {
                methodName = (methodName == "StartsWith") ? "Contains" : "EndsWith";
                textLength = value.Length;
            }

            var stringType = typeof(string);
            return stringType.GetMethod(methodName, new Type[] { stringType });
        }
    }
  

Использование метода расширения WhereLike заключается в следующем:

 var searchTerm = "*Inc";
var q = db.Customers
        .WhereLike(c => c.CompanyName, searchTerm, '*')
        .ToList();
  

источник этого можно найти здесь .

Комментарии:

1. пожалуйста, не публикуйте ответы «только для ссылок»!

2. Добавьте еще немного информации, чтобы она могла пережить гниение ссылок.

3. Я надеюсь, вы попросили автора блогов скопировать и вставить его работу сюда … в любом случае, да, это лучше

4. Я добавил источник, я использовал кавычки, и я не утверждаю, что это моя работа, поэтому я не вижу в этом никаких проблем.