首页 > 解决方案 > LINQ:从传入的 IEnumerable 获取具有匹配字符串属性的所有对象以高效的方式

问题描述

刚刚看到这段代码,问自己如何改进以减少查询量。尝试了一些 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, Version=4.0.0.0, Culture =中性,PublicKeyToken=b77a5c561934e089]]'。仅支持原始类型、枚举类型和实体类型。”

标签: c#.netperformanceentity-frameworklinq

解决方案


问题出在您的查询中。试试这个代码:

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);
    }
}

推荐阅读