嵌套列表<;字符串>;通过LINQ SQL查询在自定义类列表中

本文关键字:列表 查询 自定义 SQL 通过 lt 字符串 gt 嵌套 LINQ | 更新日期: 2023-09-27 17:57:53

这是我的代码,用于从数据库中检索有关打印机驱动程序列表的信息。该表列出了打印机驱动程序,以及在哪些服务器上找到了这些驱动程序

 public List<PrinterDrivers> GetPrinterDriversFromCache()
        {
            using (dbPrintSimpleDataContext db = new dbPrintSimpleDataContext())
            {
                var q = from p in db.GetTable<tblPrinterDriverCache>()
                        where p.CacheGUID == mostRecentCacheID()
                        group p by p.PrinterDriver into g
                        select new PrinterDrivers
                        {
                            DriverName = g.Key,
                            InstalledOn = g.Where(x => x.PrinterDriver == g.Key).Select(x => x.PrinterServer).ToList(),
                            Usable = (g.Count() == Properties.Settings.Default.PrintServers.Count)
                        };
                return q.ToList();
            }
        }

我试图返回的是一个List,它包含一个属性,其中包含打印机驱动程序所在的服务器。我认为我已经达到了我当前LINQ SQL知识的极限:(

生成的列表应包含:

DriverName=打印机驱动程序名称,在本例中为组密钥(字符串)

InstalledOn=列表(包含在此打印机驱动程序上找到的服务器列表)

可用=简单的bool检查它所在的服务器是否与首选项文件中的服务器数量相同。

感谢您的帮助:)

嵌套列表<;字符串>;通过LINQ SQL查询在自定义类列表中

试试这个:

LINQ Lambda,通过列表分组

问题是Linq不知道ToList。整个查询只有一部分在服务器上执行,因为在最后的ToList调用之前还有一个额外的ToList调用(下面的未测试代码)

public List<PrinterDrivers> GetPrinterDriversFromCache()
    {
        using (dbPrintSimpleDataContext db = new dbPrintSimpleDataContext())
        {
            var q = (from p in db.GetTable<tblPrinterDriverCache>()
                    where p.CacheGUID == mostRecentCacheID()
                    group p by p.PrinterDriver.DriverName into g
                    select g
                    ).ToList().Select(g => new PrinterDrivers
                    {
                        DriverName = g.Key,
                        InstalledOn = g.Where(x => x.PrinterDriver == g.Key).Select(x => x.PrinterServer).ToList(),
                        Usable = (g.Count() == Properties.Settings.Default.PrintServers.Count)
                    });
            return q.ToList();
        }
    }

从我链接的答案中翻译出相同的模式,你的答案是:

var q = db.GetTable<tblPrinterDriverCache>()
            .Where(p => p.CacheGUID == mostRecentCacheID())
            .Select(o => new { DriverName = o.DriverName, PrintServer = o.PrintServer })
            .GroupBy(g => g.DriverName)
            .ToList()
            .Select(g => new PrinterDrivers
                {
                    DriverName = g.Key,
                    InstalledOn = g.Select(p => p.PrinterServer).ToList(),
                    Usable = (g.Count() == Properties.Settings.Default.PrintServers.Count)
                }
            )
            .ToList();