如何使用Entity Framework重复使用select语句?

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
            };

如何在其他查询中重新使用语句的选择部分?即

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);
            };

我尝试仅使用映射器方法:

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个回答

1

在查询定义中,您不能像那样使用常规函数调用。LINQ需要表达式树,它无法分析已编译的函数并将其神奇地转换为SQL。阅读此处以获取更详细的解释

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

在我看来,您应该问自己一个更基本的问题,那就是您是否真的需要这个额外的映射层?看起来您正在实现EF已经完全能够为您执行的操作...


2
这样说吧,我不想写大约30次的 User = new User() { UserId = item.User.UserId, UserName = item.User.Username, NField = item.User.etc } - djdd87

0

尝试将你的MapUser方法定义为静态(static)方法。


嗯...在L2S中似乎修复了它,但在EF中没有。不过你可以看看这篇文章:http://blogs.msdn.com/b/efdesign/archive/2008/10/08/edm-and-store-functions-exposed-in-linq.aspx - Yakimych

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