string.Join in Linq to Entity queries

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了string.Join in Linq to Entity queries相关的知识,希望对你有一定的参考价值。

我目前正在将我的数据访问代码从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和类似的方法?

答案

我建议创建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();

以上是关于string.Join in Linq to Entity queries的主要内容,如果未能解决你的问题,请参考以下文章

[Linq]使用EF To Linq执行类似sql的in语句

Linq to Entities - SQL“IN”子句

LINQ to Entities 中的“NOT IN”子句

LINQ体验——LINQ to SQL语句之Group By/Having和Exists/In/Any/All/Contains

Linq to sql where [column] in(值列表与其他架构)

SQL Where in to Linq with DataTable