使用Linq投影中的方法

4

给定以下代码:

        var EmployeeXPosition = from emp in context.WTDEmployee
                                from ep in emp.WTDEmployeeXOXPosition
                                select new { 
                                    EmployeeId = emp.id, 
                                    FullNameAndPosition =  string.Format("{0} {1} : {2}", emp.FirstName, emp.LastName, ep.WTDPosition.Position) 
                                };

它会报错:

LINQ to Entities 不识别方法 'System.String Format(System.String, System.Object, System.Object, System.Object)',这个方法无法被翻译成存储表达式。

当然,我可以做到:

 emp.FirstName+" "+ emp.LastName +" : " + ep.WTDPosition.Position

但是它看起来很丑,你有没有关于如何使用 string.Format 的建议?
2个回答

5

通常我会通过创建两个语句来解决这个问题 - 一个在LinqToEntities(或ToSql,或其他)中,然后另一个在LinqToObjects中。我在存储过程中完成所需操作,然后再使用内存中的对象进行单独的处理步骤。这样可以兼顾两种最好的方法。

 var EmployeeXPosition = from emp in context.WTDEmployee
                                from ep in emp.WTDEmployeeXOXPosition
                                select new { 
                                    emp.id, 
                                    emp.FirstName, 
                                    emp.LastName,
                                    ep.WTDPosition.Position
                                };

var result = from item in EmployeeXPosition.ToList()
             select new 
             {
                EmployeeId = item.id, 
                FullNameAndPosition =  string.Format("{0} {1} : {2}", item.FirstName, item.LastName, item.Position) 
             };

1

这个 CodePlex 项目 宣称可以完全满足您的需求。不幸的是,我现在没有时间尝试它 - 但这里是他们的描述

LINQ 表达式投影库提供了工具,使得即使 lambda 表达式未在查询中定义,而是存储在变量中或通过函数或属性检索,也能在 LINQ 投影中使用 lambda 表达式(到匿名和预定义类型)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接