Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > LINQ (Language-Integrated Query) > Like для множества значений


Автор: swetik1981 21.12.2014, 13:11
Имеется две таблицы.
Код

Table1
Ивановский
Петр
Петрович
Иванович
Автоивановск
Петров
Петровский
Сидоров
Иван
Новопетровск
Сидорцы


Код

Table2
иван
фёдор
сидор
максим


Как с использованием LINQ выбрать из Table1 только те строки, которые содержат в себе (в начале, середине или в конце) одну из строк в таблице Table2
То есть в результате должно выйти:
Код

Table3
Ивановский
Иванович
Автоивановск
Сидоров
Иван
Сидорцы


Автор: chupachups 24.12.2014, 13:51
выбирай на вкус из трех вариантов (если посидеть подольше, можно еще вариантов придумать):
Код

Console.WriteLine("--------- Вариант 1 ---------------");
var query2 =
    from parts in table2.AsEnumerable()
    select parts.Field<string>("name").ToLower();
var query1 =
    from names in  table1.AsEnumerable()
    where query2.Any(part => names.Field<string>("name").ToLower().Contains(part))
    select names.Field<string>("name");

foreach (string name in query1)
    Console.WriteLine(name);

Console.WriteLine("--------- Вариант 2 ---------------");
var results = table1.AsEnumerable()
    .Where
    (
        row =>
        {
            if (table2.AsEnumerable().Any(part => row.Field<string>("name").ToLower().Contains(part.Field<string>("name").ToLower())))
                return true;
            else
                return false;
        }
    )
    .Select<DataRow, string>
    (
        row => row.Field<string>("name")
    );

foreach (string name in results)
    Console.WriteLine(name);

Console.WriteLine("--------- Вариант 3 ---------------");
var query3 =
    from names in table1.AsEnumerable()
    let nameSource = names.Field<string>("name").ToLower()
    from parts in table2.AsEnumerable()
    let partName = parts.Field<string>("name").ToLower()
    where nameSource.Contains(partName)
    select names.Field<string>("name");

foreach (string name in query3)
    Console.WriteLine(name);


Этот ответ добавлен с нового Винграда - http://ru.vingrad.com/Like-dlya-mnozhestva-znacheny-id54969cf4ae2015cc2e8b4567#findElement_E7045_549a9aa3ae2015734fe21009_0

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)