Где предложение оператора LINQ для поиска экземпляров строки в коллекции List <string>? - PullRequest
1 голос
/ 08 августа 2011

Я пытаюсь создать предложение Where для оператора Linq, который должен определить, существуют ли значения AccountNumber , полученные как показано ниже, в коллекции List<string>.

До сих пор я пробовал это:

private void FindAccountNumbers(List<string> AccountNumbers)
{
    var query = from abc 
    select new
    {
        AccountNumber = abc.AccountNumber
    };

    query = query.Where(AccountNumbers.Contains(x => x.AccountNumber));
}

Однако я получаю следующую ошибку сборки:

Аргументы типа для метода 'System.Linq.Queryable.Where(System.Linq.IQueryable, System.Linq.Expressions.Expression>) 'не может быть выведен из использования.Попробуйте явно указать аргументы типа.

Во время выполнения query содержит значения AccountNumber, и я пытаюсь сократить это на основе совпадений, найденных в AccountNumbersколлекция (аналогично оператору IN в TSQL).Должен ли я использовать Intersect вместо Contains?Что я делаю неправильно??

Ответы [ 6 ]

8 голосов
/ 08 августа 2011

Я думаю, вы хотите иметь это:

query = query.Where(x => AccountNumbers.Contains(x.AccountNumber));
2 голосов
/ 08 августа 2011

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

var query = from x in abc
            where AccountNumbers.Contains(x.AccountNumber)
            select new { x.AccountNumber };

Это вернет вам любой AccountNumber в этом списке, если AccountNumber на самом деле не является строкой. Это может быть вашей проблемой.

1 голос
/ 08 августа 2011

Это потому, что ваш синтаксис для from неправильный, я предполагаю, что ваша коллекция содержит abc элементов для сопоставления: abc

Правильный синтаксис будет (Версия 1)

var query = from x in abc
            select new  { AccountNumber = x.AccountNumber };

query = query.Where(x=>AccountNumbers.Contains(x.AccountNumber));

вам также не нужно вводить анонимный тип, поскольку вы просто хотите получить то же поле, которое вы можете просто сделать (Версия 2)

var query = from x in abc select x.AccountNumber;
query = query.Where(x=>AccountNumbers.Contains(x));

Однако вы можете просто щелкнуть Where прямо на вашеморигинальная коллекция.(Версия 3)

var query = abc.Where(x=>AccountNumbers.Contains(x.AccountNumber);

Или, если вы просто пытаетесь найти, существуют ли какие-либо в коллекции (Версия 4)

var query = abc.Any(x=>AccountNumbers.Countains(x.AccountNumber);
  • Версия 1 вернет IEnumerable
  • Версия 2 вернет IEnumerable
  • Версия 3 вернет IEnumerable
  • Версия 4 вернет bool
0 голосов
/ 07 марта 2014

Последний ответ неверен, потому что он упомянул один важный момент и, очевидно, не был проверен. Первая проблема заключается в том, что вы не можете смешивать запрос SQL, который не был выполнен, и список строк, ВЫ НЕ МОЖЕТЕ СМЕШАТЬ!!!Решение этой проблемы и проверено:

var AccountNumbers = select accountNumber from table where.... // is a entitie
    private void FindAccountNumbers(IQueryable<acounts> AccountNumbers) //entitie object not   string
    {
        var query = from abc 
        select new
        {
            AccountNumber = abc.AccountNumber
        };

        query = query.Join(AccountNumbers, abc => abc.AccountNumber, aco=> aco, (ac, coNum) => cpac);
    }

Это действительно работает!Необходимо упомянуть, что это решение, когда вы работаете с linq и Entities Framework!

0 голосов
/ 08 августа 2011

Я бы пошел с этим:

private void FindAccountNumbers(List<string> AccountNumbers)
{
    // Get a strongly-typed list, instead of an anonymous typed one...
    var query = (from a in abc select a.AccountNumber).AsEnumerable();

    // Grab a quick intersect
    var matched = query.Intersect(AccountNumbers)
}

Один лайнер?

var query = (from a in abc select a.AccountNumber).AsEnumerable().Intersect(AccountNumbers);
0 голосов
/ 08 августа 2011

Позвольте мне проверить, что вы пытаетесь сделать.

У вас есть коллекция объектов abc. Вы хотите извлечь номер учетной записи из каждого члена этой коллекции, сравнить его со списком переданных номеров счетов и определить ... что? Если есть какое-либо перекрытие или ЧТО такое перекрытие?

Если поле AccountNumber является строкой, вы можете сделать это:

private IEnumerable<string> OverlappingAccountNumbers(IEnumerable<string> accountNumbers)
{
    return abc.Select(x => x.AccountNumber)
              .Intersect(accountNumbers);
}

Или для логического случая:

private bool AnyOverlappingAccountNumbers(IEnumerable<string> accountNumbers)
{
    return abc.Select(x => x.AccountNumber)
              .Intersect(accountNumbers)
              .Count() > 0;
}
...