重构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[]
,但没有任何东西在一行中工作。
我猜它不能翻译成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;
}