重构Linq查询

本文关键字:查询 Linq 重构 | 更新日期: 2023-09-27 18:17:07

我有一个LINQ查询,我试图最小化,但我得到一个错误,当我尝试。Genkai_db是一个实体框架实例和i查询sql表。

正在运行:

public UNITY_DB_PRODEntities12 Genkai_db = new UNITY_DB_PRODEntities12();

    public List<string[]> Query_FpacInactif()
    {
        List<string[]> li = new List<string[]>();
        List<string> u = Genkai_db.final_full_data
            .Where(x => x.FPAC_TimeStamp > 100)
            .Select(x => x.computername)
            .ToList<string>();
        foreach (string a in u)
        {
            string[] Sarray = new string[] { a, "FPAC" };
            li.Add(Sarray);
        }
        return li;
    }

在另一个类似的函数中,我尝试重构成一行:

public List<string[]> Query_McAfeeConsolidation()
{
    List<string[]> li = (Genkai_db.Consolidation_McAfee
        .Select(x => new string[] { x.computername, "McAfee" }))
        .ToList();
    return li;  
}

最后一个函数失败,出现错误:

无法初始化"System"类型的数组。查询中的字符串[]'结果。使用"System.Collections.Generic。清单1(系统。字符串)'相反。

PS:我在询问之前尝试了很多事情,甚至使用List<string>超过string[],但没有任何东西在一行中工作。

重构Linq查询

我猜它不能翻译成SQL查询,你可以把它带回内存使用AsEnumerable和项目。

基于您的原始查询,您可以始终过滤SQL中的记录,先前的查询将整个数据加载到内存中,这显然不是很好(但根据您的Query_McAfeeConsolidation方法编写):-

 List<string[]> li = Genkai_db.Consolidation_McAfee
                          .Where(x => x.FPAC_TimeStamp > 100)
                          .Select(x => x.computername)
                          .AsEnumerable()
                          .Select(x => new string[] { x, "McAfee" }))
                          .ToList();

应该可以了

return Genkai_db.final_full_data
    .Where(x => x.FPAC_TimeStamp > 100)
    .Select(x => x.computername)
    .AsEnumerable()
    .Select(cn => new string[] { cn, "FPAC" })
    .ToList();

这将从DB中查询computername,然后在内存中创建数组,因为AsEnumerbale将从EF转换到Linq-to-objects。

Linq似乎不能很好地处理数组。

使用List比;而不是:

  public List<List<string>>> Query_McAfeeConsolidation()
  {
      List<List<string>> li = Genkai_db.Consolidation_McAfee
                                       .Select(x => new List<string> { x.computername, "McAfee" })
                                       .ToList();
      return li;
  }