Несколько как в лямбда-выражении - PullRequest
0 голосов
/ 24 августа 2018

У меня есть переменная string [], которую я хочу использовать в лямбда-выражении для фильтрации данных, используя как предложение. Я пытался использовать , содержит , но он работает как 'в' предложении, а это не то, что мне нужно.

Пожалуйста, смотрите код ниже, который ведет себя как в предложении:

var inventories = ..............AsQuerable();
string[] strArray = <<somevalues>>;
inventories = inventories.Where(c => !strArray.Contains(c.columnName));

Может ли кто-нибудь предоставить мне лямбда-выражение, которое может фильтровать записи, используя как вместо в с использованием массива.

Ответы [ 4 ]

0 голосов
/ 24 августа 2018

Это не чистое Lambda выражение, но, может быть, оно может помочь:

List<SomeObject> inventories = new List<SomeObject>();
// add objects to list...
string[] strArray = <<somevalues>>;
// result will be stored here
List<SomeObject> filtered = new List<SomeObject>();

foreach (var itm in strArray)
{
    // LIKE '%SOMEVALUE%'
    var match = inventories.Where(x => x.columnName.Contains(itm)).ToList();
    // LIKE '%SOMEVALUE'
    // var match = inventories.Where(x => x.columnName.StartsWith(itm)).ToList();
    // LIKE 'SOMEVALUE%'
    // var match = inventories.Where(x => x.columnName.EndsWith(itm)).ToList();
    foreach (var m in match)
        filtered.Add(m);
}
0 голосов
/ 24 августа 2018

Для этой цели LINQ предоставляет только методы .Where(), .StartsWith() или .EndsWith().. Также здесь есть довольно похожий вопрос Как сделать SQL Like% в Linq?

0 голосов
/ 24 августа 2018

В отличие от VB.NET, C # не имеет встроенного , как -оператор. Тем не менее, вы можете легко использовать оператор из VB.NET. Вам нужно сослаться на сборку Microsoft.VisualBasic.dll и добавить using Microsoft.VisualBasic.CompilerServices; вверху файла. Тогда вы можете сделать

 var inventories = ..............AsQuerable();
 string[] strArray = <<somevalues>>;
 inventories = inventories.Where(c => !strArray.Any(s => LikeOperator.LikeString(c.columnName, s, CompareMethod.Text)));
0 голосов
/ 24 августа 2018

Я не совсем уверен, что вы пытаетесь сделать, но я думаю, что это то, что вы пытаетесь достичь. Если нет, пожалуйста, предоставьте больше информации, и я обновлю свой ответ.

Чтобы проверить, равна ли строка части другой строки (что подобно ), вы можете использовать метод .Contains:

bool contains = "Some fancy sentence".Contains("fancy");

Это оценит как истинное. Для вашего примера это приведет к следующему:

var inventories = ..............AsQuerable();
string[] strArray = <<somevalues>>;
inventories = inventories.Where(inv => !strArray.Any(s => inv.columnName.Contains(s)));

Это проверяет все запасы и удаляет все запасы, для которых имя столбца инвентаря (частично) встречается в любом из значений strArray.

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