2010-08-06 125 views
2

我有两个表公司和员工。与公司(一) - 员工(很多)有关系。
我想将所有员工的名字连接到一个字符串和输出。 我知道我可以写这样的查询:如何编写这个linq查询以避免查询太多?

String names = ""; 
    foreach(var emp in Company.Employee) 
    { 
     names += emp.name; 
    } 

,但如果我用这个意思,我会加载所有员工记录到内存中,然后进行比较,这是时间和内存的浪费,而且会性能低下。 因此,在linq中,是否可以创建一个可以在单个SQL中返回所有连接名称的查询?

在此先感谢!任何建议将不胜感激!

回答

2
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()。如果您不关心较小的语义差异,则可以在.NET 4.0之前使用First()而不是SelectMany()

+0

你知道的指定者功能产生了哪些SQL条款? – MemoryLeak 2010-08-06 13:04:34

+0

如果你有.Net 4.0,你不需要'ToArray'。 – Gabe 2010-08-06 14:04:27

+0

'ToArray()'只是触发查询执行并将'IEnumerable '变成一个数组。正如Gabe提到的,你可以跳过.NET 4.0中的调用,因为有一个新的过载接受'IEnumerable '。 – 2010-08-06 14:26:45

0

这是丹尼尔的简化变化,但我认为它应该工作(约架构使得假设)

var employeeNames = (from e in context.Employee 
         where e.CompanyId = 0xF00 
         select e.Name) 
         .ToArray(); 

var result = String.Join(" ", employeeNames);