Поиск строк в Linq для Entity Framework - PullRequest
0 голосов
/ 02 марта 2010

Я хочу создать оператор Where в моем операторе Linq, но столкнулся с небольшим камнем преткновения.

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

В моем обычном операторе Sql я просто перебрал бы строковый массив и построил там предложение Where, а затем либо передал бы это хранимой процедуре, либо просто выполнил строку SQL. Но я не уверен, как это сделать с Linq to Entity?

( From o In db.TableName Where o.Field LIKE Stringvalue Select o ).ToList()

Ответы [ 5 ]

1 голос
/ 02 марта 2010

Для динамического построения лучше всего использовать дерево выражений. Дайте этому шанс:

IQueryable<EntityType> query = db.Tablename;
Expression<Func<EntityType, bool>> expression = null;

foreach (string item in yourString.Split(","))
{
    string localItem = item; // so that we don't close over the loop variable

    Expression<Func<EntityType, bool>> exp = x => x.FieldName.Contains(localItem);

    if (expression == null)
    {
        expression = exp;
    }
    else
    {
        expression = Expression.Lambda<Func<int, bool>>(
            Expression.OrElse(expression.Body,  
            Expression.Invoke(exp,expression.Parameters.Cast<Expression>())), 
            expression.Parameters);
    }
}

var results = query.Where(expression).ToList();
1 голос
/ 02 марта 2010

Как насчет

(from o in db.Tablename
    where o.Field.Contains(Stringvalue)
    select o).ToList();
0 голосов
/ 03 марта 2010

Воздушный код основывается на ответе Адама и использует Объединение , чтобы связать воедино результаты, имитируя И вместо ИЛИ.

РЕДАКТИРОВАТЬ Я удалил свою рекомендацию использовать Distinct, потому что Union отфильтровывает дубликаты.

var query = null; 

foreach(string item in yourString.Split(",")) 
{ 
    var newquery = db.Tablename.Where(x => x.FieldName.Contains(item));  
    if (query == null) {  
      query = query.union(newquery);    
    } else {  
      query = newquery;  
    }  
}  

var results = query.ToList(); 
0 голосов
/ 02 марта 2010

РЕДАКТИРОВАТЬ: Неправильно истолковали ваш вопрос, как насчет:

string filters = "a,b,c,d";
var result = from filter in filters.Split(',')
             from record In db.TableName
             where record.Field.Contains(filter)
0 голосов
/ 02 марта 2010
var fcs = from c in Contacts
          where c.FirstName.ToLower().StartsWith(e.value.ToLower())
          select c;

Вы можете использовать любые строковые функции, такие как содержа

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...