【问题标题】:How to pass a Lambda Expression as method parameter with EF如何使用 EF 将 Lambda 表达式作为方法参数传递
【发布时间】:2012-04-07 23:01:06
【问题描述】:

如何将 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))
}

【问题讨论】:

  • 你能不能重新格式化一下,很难理解 - 其他人会阅读/帮助更多
  • SO 编辑器太难用了,但也许你有一个具体的问题我可以回答?
  • 您是否尝试将您的查询投射到.AsQueryable()?这样你就可以“移动”它,稍后过滤等等 - 我认为这就是你在这里所追求的。
  • 对于编辑器 - 就在 VS 中复制之前,取“整行”(复制行不是文本),它需要大致“一个标签”,通常效果很好。
  • 我会试试 .AsQueryable() 谢谢!

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


【解决方案1】:

也许是这样的?

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

【讨论】:

  • 非常感谢您的回答!这正是我所需要的,它直接开箱即用,无需以任何方式更改您的代码!
【解决方案2】:

只是为了发布我们已经讨论过的内容......

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

Using AsQueryable With Linq To Objects And Linq To SQL

How do I cache an IQueryable object?

我见过更好的例子,但我手头没有,基本上就像我提到的那样,您可以使用它来将您的查询保存在一个表单中,以便您可以进一步过滤、更改,直到您了解所有情况的最后一刻做完就可以真正实现枚举查询了。

希望对你有帮助

【讨论】:

  • 谢谢!我决定使用其他完美的解决方案!
猜你喜欢
  • 1970-01-01
  • 2012-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-03
  • 1970-01-01
相关资源
最近更新 更多