Как я могу добавить подсчет переменных SqlMethods.Like () в одном запросе? - PullRequest
0 голосов
/ 31 августа 2010

Можете ли вы помочь мне в следующем: я хотел бы добавить переменную count SqlMethods.Like () в один запрос?

Например: у меня есть четыре слова в списке catCode, как я могу создать запрос LINQ с четырьмя SqlMethods.Like ()?

using (var db = new MappingDataContext(_connection))
{
    db.ObjectTrackingEnabled = false;

    return (
        from r in db.U_CDW_REPORTs
        where (catCode.Length > 0 ? 
            SqlMethods.Like(r.CATEGORY, catCode) : r.CATEGORY != "*")
        where r.SI_QTY > 0
        orderby r.SI_QTY descending
        select new Item
        {
            ...
        }).ToList();
}

Ответы [ 3 ]

2 голосов
/ 31 августа 2010

То, что вам нужно, это динамические операции ИЛИ SqlMethod.Like. Вам нужен PredicateBuilder .

<ч /> Обновление: вот пример того, как использовать построитель предикатов.

string[] searchItems =
    new string[] { "Pattern1", "Pattern2", "Pattern3" };

var likeExpression = PredicateBuilder.False<U_CDW_REPORT>();

foreach (string searchItem in searchItems)
{
    var searchPattern = "%" + searchItem + "%";
    likeExpression = likeExpression.Or(r => 
        SqlMethods.Like(r.CATEGORY, searchPattern));
}

return (
    from r in db.U_CDW_REPORTs.Where(likeExpression)
    where r.SI_QTY > 0
    orderby r.SI_QTY descending
    select new Item { ... }).ToList();
1 голос
/ 31 августа 2010

РЕДАКТИРОВАТЬ: сделал код проще.Также обратите внимание на обновленное объяснение, приведенное ниже.

Вы можете использовать запрос с несколькими предложениями Where следующим образом.Обратите внимание, что этот подход и предложения Where означает, что все поисковые термины должны будут существовать.Другими словами, это похоже на ... where (condition1) && (condition2) && (conditionN).

string[] words = { "A", "B", "C" };
var query = dc.Products.AsQueryable(); // gives us an IQueryable<T> to build upon
foreach (var s in words)
{
    query = query.Where(p => SqlMethods.Like(p.ProductName, "%" + s + "%"));
}

foreach (var item in query)
{
    Console.WriteLine(item.ProductName);
}

Идея состоит в том, чтобы настроить первую часть запроса, затем выполнить цикл поиска по условиям поиска и обновить запрос.Конечно, вы должны обновить свой шаблон по мере необходимости;Я использовал %word% только для иллюстрации.

1 голос
/ 31 августа 2010

Вы имеете в виду, что у вас есть 4 непересекающиеся LIKE предложения?

from entityRow in ctx.MyEntity
where (SqlMethods.Like(entityRow.Col, "%Pattern1%")
    || SqlMethods.Like(entityRow.Col, "%Patte%rn2%") 
    || SqlMethods.Like(entityRow.Col, "Pattern3%") 
    || SqlMethods.Like(entityRow.Col, "%Patte%rn4%")) 
select entityRow;

ОБНОВЛЕНИЕ:

В таком случае, посмотрите на это: LINQ для LIKE запросов элементов массива

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