【问题标题】:Refactorise Linq query重构 Linq 查询
【发布时间】:2015-10-09 13:42:32
【问题描述】:

我尝试最小化一个 LINQ 查询,但尝试时出现错误。 Genkai_db 是一个实体框架实例,我查询 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.String []”类型的数组 结果。使用'System.Collections.Generic.List`1 [System.String]' 而是。

PS:在询问之前我尝试了很多东西,甚至使用List&lt;string&gt; 而不是string[],但没有任何效果。

【问题讨论】:

  • 如果您能向我们展示您的输入对象的样子,以及您想要得到的结果究竟是什么,将会很有帮助
  • 请提供Consolidation_McAfee的类型信息。
  • 为什么第一种方法选择Genkai_db.final_full_data 而第二种方法选择Genkai_db.Consolidation_McAfee?这是一个错误吗?
  • 编辑了它的实体框架实例
  • Linq to Sql 查询被解释并转换为 sql。 Linq to Sql 不知道如何获取您的查询并将其转换为返回可枚举字符串数组的 sql 查询。这是您必须解决的限制。

标签: c# sql .net linq


【解决方案1】:

我猜它无法将其转换为 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();

【讨论】:

  • 它的工作,所以如果我理解 EF 不能一次性将查询结果投射到 List 我必须在 2 次。
  • @Zwan - 是的,它将查询转换为 SQL,并且它的提供程序不支持投影数组。甚至任何其他 C# 方法,例如 String.Join。
【解决方案2】:

这应该可以工作

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。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-02-08
      • 2016-03-24
      相关资源
      最近更新 更多