LINQ: получить все объекты с совпадающим строковым свойством из входящего IEnumerable <string>быстрым способом - PullRequest
0 голосов
/ 08 ноября 2018

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

    public static Dictionary<string, Computer> GetComputer(IEnumerable<string> workStations)
    {
        var dict = new Dictionary<string, Computer>();
        using (var db = new ComputerContext())
        {
                foreach (var workStation in workStations)
                {
                    var t = db.Computers.FirstOrDefault(o => o.Id.Equals(workStation));

                    if (!dict.ContainsKey(workStation))
                    {
                        dict.Add(workStation, t);
                    }
                }

                return dict;
        }
    }

При попытке что-то вроде этого:

var computers = db.Computers.Where(x => workStations.Select(y => y).Equals(x.Id)).ToList();

foreach (var computer in computers)
{
    if (!dict.ContainsKey(computer.Id))
    {
        dict.Add(computer.Id, computer);
    }
}

Intellisense говорит мне «Подозрительное сравнение: в решении нет типа, унаследованного от обоих

'System.Collections.Generic.IEnumerable' и 'string' ", которые приводит к исключению "Невозможно сравнить элементы типа 'System.Collections.Generic.IEnumerable`1 [[System.String, mscorlib, Версия = 4.0.0.0, Культура = нейтральная, PublicKeyToken = b77a5c561934e089]] '. Только примитивные типы, типы перечисления и типы объектов поддерживается. "

1 Ответ

0 голосов
/ 08 ноября 2018

Проблема в вашем запросе. Попробуйте этот код:

var computers = db.Computers.Where(x => workStations.Any(y => y.Equals(x.Id)).ToList();

foreach (var computer in computers)
{
    if (!dict.ContainsKey(computer.Id))
    {
        dict.Add(computer.Id, computer);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...