2012-04-07 75 views
1

如何将EF表达式作为方法参数传递?如何将Lambda表达式作为方法参数传递给EF

为了说明我的问题我已经创建了一个伪代码示例:

第一个例子是我今天的方法。该示例使用EF和Fancy Retry Logic。 我需要做的是封装Fancy Retry Logic,使它变得更通用并且不重复。

在第二个示例中,我希望它是如何使用接受EF表达式作为参数的辅助方法。

这对于SQL来说是件小事,但我想用EF来做,所以我可以从强类型对象中受益。

第一个例子:

public static User GetUser(String userEmail) 
{ 
    using (MyEntities dataModel = new MyEntities()) 
    { 
     var query = FancyRetryLogic(() => 
     { 
      (dataModel.Users.FirstOrDefault<User>(x => x.UserEmail == userEmail))); 
     }); 

     return query; 
    } 
} 

第二个例子:

T RetryHelper<T>(Expression<Func<T, TValue>> expression) 
{ 
    using (MyEntities dataModel = new (MyEntities()) 
    { 

     var query = FancyRetryLogic(() => 
        { 
         return dataModel.expression 
        }); 
    } 
} 

public User GetUser(String userEmail) 
{ 
    return RetryHelper<User>(<User>.FirstOrDefault<User>(x => x.UserEmail == userEmail)) 
} 
+1

你可以格式化该位,苦苦追随 - 别人会读它/帮助更多 – NSGaga 2012-04-07 23:08:20

+0

的SO编辑是这么辛苦的工作,但也许你有一个具体的问题,我可以回答? – 2012-04-07 23:13:16

+1

是否尝试将查询转换为'.AsQueryable()'?这样你可以“移动”它,过滤等等。 - 我认为这就是你在这之后。编辑器的 – NSGaga 2012-04-07 23:14:10

回答

2

也许是这样的?

public TValue RetryHelper<T, TValue>(Func<ObjectSet<T>, TValue> func) 
    where T : class 
{ 
    using (MyEntities dataModel = new MyEntities()) 
    { 
     var entitySet = dataModel.CreateObjectSet<T>(); 
     return FancyRetryLogic(() => 
       { 
        return func(entitySet); 
       }); 
    } 
} 

public User GetUser(String userEmail) 
{ 
    return RetryHelper<User, User>(u => u.FirstOrDefault(x => x.UserEmail == userEmail)); 
} 
+0

非常感谢您的回答! 这正是我所需要的,它直接开箱即用,无需以任何方式更改代码! – 2012-04-08 01:20:42

1

刚刚发布的东西,我们已经讨论过......

这里是一个链接,可以帮助你,我觉得这有类似你需要的东西。

Using AsQueryable With Linq To Objects And Linq To SQL

How do I cache an IQueryable object?

我见过的最好的例子,但我没有让他们得心应手,基本上正如我所说,你可以用它来保持你的查询的形式,这样就可以进一步过滤,直到最后一刻你知道所有事情都已完成并能实际实现并列举查询。

希望它有帮助

+0

谢谢!我决定使用完美工作的其他解决方案! – 2012-04-08 01:22:53