2010-09-21 66 views
3

鉴于以下代码:LINQ的投影内使用方法

 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实体无法识别 方法“System.String 格式(System.String ,System.Object, System.Object,System.Object)'方法, ,并且此方法不能将 转换为存储表达式。果然

我可以这样做:

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

但它只是看起来丑陋,如何使用string.Format,而不是有什么建议?

回答

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

This codeplex project声称做你想要的。 不幸的是我现在没有时间去尝试它 - 但在这里就是他们说

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