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

时间:2012-04-07 23:01:07

标签: c# .net entity-framework lambda linq-expressions

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

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

第一个例子是我今天的方法。该示例使用EF和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))
}

2 个答案:

答案 0 :(得分: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));
}

答案 1 :(得分:1)

发布我们已经讨论过的内容......

这是一个可能对您有帮助的链接,我认为它与您需要的内容类似。

Using AsQueryable With Linq To Objects And Linq To SQL

How do I cache an IQueryable object?

我见过更好的例子,但是我没有把它们放在手边,基本上我提到你可以使用它来保存你的查询表格,以便你可以进一步过滤,改变直到你知道所有的最后一刻已完成并且可以实际实现和枚举查询。

希望有所帮助