Использование «Содержит внутри» для списка

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

это мой код

Я пробовал с динамическим linq. Это не работает

Это динамический линк. Не работает

var list = new List<string>(2) { "11111", "22222" };


accounts = accounts.Where("@0.Contains(outerIt.PartnerCompanyId)", list);

Это тоже не работает

accounts = accounts .Where(a =>
               a.PartnerCompanyId.Contains(list.Any().ToString()));

Также я хочу, чтобы SQL генерировал что-то вроде этого

WHERE PartnerCompanyId IN (@gp1, @gp2, @gp3, …)

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

…WHERE PartnerCompanyId IN (@gp1)

Есть ли способ сделать это?


person Gilberto Langarica    schedule 18.07.2019    source источник
comment
Проблема в том, что я получаю это… ГДЕ PartnerCompanyId IN (gp1). То, что я ожидаю сгенерировать, будет больше похоже на это … WHERE PartnerCompanyId IN (gp1, gp2, …)   -  person Gilberto Langarica    schedule 18.07.2019
comment
К вашему сведению, Where(a => a.PartnerCompanyId.Contains(list.Any().ToString())) будет искать любые PartnerCompanyId, которые содержат подстроку true, потому что list.Any().ToString() будет оцениваться как true, поскольку list не пусто.   -  person juharr    schedule 18.07.2019
comment
Поискав вокруг, я нашел stackoverflow.com/questions/3258850/ помогают ли вообще ответы дерева выражений?   -  person Guvante    schedule 18.07.2019
comment
Какая версия EF Core?   -  person NetMage    schedule 18.07.2019
comment
EF 4.5 с соединителем MYSQL   -  person Gilberto Langarica    schedule 18.07.2019
comment
Значит, не EF Core? Я не вижу EF 4.5 в списке Microsoft?   -  person NetMage    schedule 18.07.2019
comment
@GilbertoLangarica попробуйте ответ ниже.   -  person AAA    schedule 19.07.2019


Ответы (3)


Если я правильно понял ваш вопрос, у вас есть список учетных записей, и вы хотите проверить, содержат ли учетные записи «список [0] ИЛИ список [1] ​​ИЛИ список [2] ...».

Мне удалось получить аналогичную реализацию, работающую с использованием Dynamic Linq.

Используя ваш код в качестве основы, вот что я сделал, чтобы заставить запрос работать:

List<string> list = new List<string>(2) { "11111", "22222" };

string argumentString = "";

for (int i = 0; i < list.Length; i++)
{
    argumentString = argumentString + "@" + i;
    argumentString = argumentString + ".Contains(outerIt.PartnerCompanyId)";

    if (i != (list.Length - 1))
    {
        argumentString = argumentString + " or ";
    }
}

var accounts = accounts.Where(argumentString, list.ToArray());

Цикл создаст строку: "@0.Contains(outerIt.PartnerCompanyId) или @1.Contains(outerIt.PartnerCompanyId)"

После создания этой строки все, что вам нужно, — это простой запрос Linq для проверки всех элементов в списке.

Примечание: вы можете ссылаться на аргументы по порядку через и массив, но не список. Как показано здесь https://stackoverflow.com/a/40885380/10253157.

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

person KGeorge    schedule 19.07.2019

Это правильный путь:

var myaccounts = accounts.Where(a =>list.Contains(a.PartnerCompanyId));

Вы можете увидеть текстовый регистр, чтобы показать, что он работает здесь.

person AAA    schedule 18.07.2019

Вы можете просто использовать Dynamic Linq, но убедитесь, что тип из значений вы ищете и тип одинаковы.

Так что это будет работать только в том случае, если PartnerCompanyId также является строкой.

var list = new List<string>(2) { "11111", "22222" }; accounts.Where("@0.Contains(outerIt.PartnerCompanyId)", list);

Тестирование в LinqPad показывает ожидаемый SQL: -- Region Parameters DECLARE @p0 Int = 7065 DECLARE @p1 Int = 7066 -- EndRegion SELECT [t0].[Id], *** FROM [MyTable] AS [t0] WHERE [t0].[Id] IN (@p0, @p1)

person Stef Heyenrath    schedule 22.07.2019