如何在Entity Framework中重用select语句?

时间:2010-08-01 20:07:49

标签: linq entity-framework linq-to-entities c#-4.0 entity-framework-4

给出以下查询:

var query = from item in context.Users // Users if of type TblUser
            select new User()          // User is the domain class model
            {
                ID = item.Username,
                Username = item.Username
            };

如何在其他查询中重用语句的select部分?即。

var query = from item in context.Jobs  // Jobs if of type TblJob
            select new Job()           // Job is the domain class model
            {
                ID = item.JobId,
                User = ReuseAboveSelectStatement(item.User);
            };

我尝试使用mapper方法:

public User MapUser(TblUser item)
{
   return item == null ? null : new User()
   {
      ID = item.UserId,
      Username = item.Username
   };
}

使用:

var query = from item in context.Users // Users if of type TblUser
            select MapUser(item);

但是如果我这样做,那么框架会抛出一个错误,例如:

  

LINQ to Entities无法识别   方法'MapUser(TblUser)'方法,   而这种方法无法翻译   进入商店表达。

2 个答案:

答案 0 :(得分:1)

您不能在类似的查询定义中使用常规函数调用。 LINQ需要表达式树,它无法分析已编译的函数并将其神奇地转换为SQL。 Read this for a more elaborate explanation

引用文章中使用的技术已合并到linqkit(分解谓词)并可能有所帮助,但我不确定您是否可以使用相同的技术来管理投影,这就是您的看法想要。

你应该问自己这个更基本的问题恕我直言,你是否真的需要这个额外的映射层?看起来你正在实施EF已经完全能够为你做的事情......

答案 1 :(得分:0)

尝试制作MapUser方法static