Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何编写此linq查询以避免过多的查询?_Linq_Linq To Sql_Linq To Entities_Aggregate - Fatal编程技术网

如何编写此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);