如何编写此linq查询以避免过多的查询?
我有两张桌子,公司和员工。公司(一人)-员工(多人)之间存在关系。如何编写此linq查询以避免过多的查询?,linq,linq-to-sql,linq-to-entities,aggregate,Linq,Linq To Sql,Linq To Entities,Aggregate,我有两张桌子,公司和员工。公司(一人)-员工(多人)之间存在关系。 我想把所有员工的名字连接成一个字符串并输出。 我知道我可以写这样一个查询: String names = ""; foreach(var emp in Company.Employee) { names += emp.name; } 但是如果我使用这个方法,我会将所有员工的记录加载到内存中,然后进行比较,这是浪费时间和内存,并且会降低性能。 那么在linq中,是否有可能创建这样一个
我想把所有员工的名字连接成一个字符串并输出。 我知道我可以写这样一个查询:
String names = "";
foreach(var emp in Company.Employee)
{
names += emp.name;
}
但是如果我使用这个方法,我会将所有员工的记录加载到内存中,然后进行比较,这是浪费时间和内存,并且会降低性能。
那么在linq中,是否有可能创建这样一个查询,在一个SQL中返回所有连接的名称
提前谢谢!如有任何建议,将不胜感激
var employeeNames = context
.Company
.Where(c => c.Id = 0xF00)
.SelectMany(c => c.Employee)
.Select(e => e.Name)
.ToArray();
var result = String.Join(" ", employeeNames);
根据确切的语义和实体框架版本,您可以稍微改变查询中选择公司的部分。在.NET 4.0中,实体框架支持
Single()
。如果你不在乎细微的语义差异,你可以使用First()
而不是.NET 4.0之前的SelectMany()
。这是Daniel的一个简化版本,但我认为它应该起作用(对模式进行假设)
你知道toarray函数生成什么sql子句吗?如果你有.Net 4.0,你不需要
toarray
toarray()
只需触发查询执行并将IEnumerable
转换成数组。正如Gabe提到的,您可以跳过.NET 4.0中的调用,因为有一个新的重载接受一个IEnumerable
。然后它与我以前写的一样,它将所有数据加载到内存中,并级联它们,但不只是返回结果?
var employeeNames = (from e in context.Employee
where e.CompanyId = 0xF00
select e.Name)
.ToArray();
var result = String.Join(" ", employeeNames);