string.Join in Linq to Entity queries

问题描述 投票:3回答:1

我目前正在将我的数据访问代码从L2S转移到Entity框架db。我对以下查询有问题

var emps = (from emp in DataContext.setupEmployees
                       let contacts = DataContext.setupContacts.Where(x => x.EmployeeID == emp.EmployeeID).Select(x => x.Contact)
                       select new 
                       {
                           EmployeeName = emp.EmployeeName,
                           Contacts = string.Join(", ", contacts.ToArray())
                       }).ToList();

EF告诉我它无法将方法string.join转换为存储的表达式。一个显而易见的解决方法是将对象带入内存(ToList,AsEnumerable等),然后调用string.Join方法

var emps = (from emp in DataContext.setupEmployees
                       let contacts = DataContext.setupContacts.Where(x => x.EmployeeID == emp.EmployeeID).Select(x => x.Contact)
                       select new 
                       {
                           EmployeeName = emp.EmployeeName,
                           Contacts = contacts
                       }).ToList().Select(x=>new{
                            x.EmployeeName,
                            Contacts = string.Join(", ",x.Contacts)
                       });

这个解决方案完美无缺,但它只是更冗长,而且我必须在许多过去在L2S中正常工作的查询中复制select子句。

我的问题:有什么方法可以避免编写这个ToList的东西,并在EF查询中调用string.Join和类似的方法?

entity-framework linq-to-sql entity-framework-4 linq-to-entities
1个回答
3
投票

我建议创建Contacts作为IEnumerable<string>数据类型而不是string数据类型。您可以使用Contacts生成任何您喜欢逗号分隔的输出等...

您可以将查询更改为如下所示:

var emps = (from emp in DataContext.setupEmployees
            select new 
            {
              EmployeeName = emp.EmployeeName,
              Contacts = DataContext.setupContacts.Where(x => x.EmployeeID == emp.EmployeeID).Select(x => x.Contact)
            }).ToList();
© www.soinside.com 2019 - 2024. All rights reserved.