【问题标题】:Given LINQ to Entities does not support "Custom methods" how do you stay DRY?鉴于 LINQ to Entities 不支持“自定义方法”,您如何保持 DRY?
【发布时间】:2010-01-11 15:16:06
【问题描述】:

我遇到了这个问题:

Custom Methods & Extension Methods cannot be translated into a store expression

基本上我有一些复杂的 LINQ 查询,所以想将它们分解为子查询,这些子查询被实现为返回 IQueryables 的方法。我希望这些 IQueryables 可以在一个 LINQ 语句中组合在一起(我很确定你可以在 LINQ to SQL 中完成)。

问题是如果你尝试这个你会得到(例如):

LINQ to Entities 无法识别 方法 'System.Linq.IQueryable`1[线程] GetThreadsByMostReccentlyPosted(Int32)' 方法,而这种方法不能 翻译成商店表达式。

在我看来,如果您使用 LINQ ORM,那么您需要能够编写 LINQ 查询。否则,必须复制和粘贴任何常见的查询逻辑。

鉴于此限制,我应该如何使用 LINQ to Entities 保持 DRY?

【问题讨论】:

  • 所以您真正想知道的是“我如何在 EF 中延迟执行,就像在 L2S 中一样?”。
  • 到目前为止我能看到的唯一方法是将我的 IQueryable 转换为 IEnumerable,此时我怀疑你失去了生成最佳 SQL 语句的能力
  • 否 - 与延迟执行无关。基本上它不会让我编写包含方法的 linq 语句

标签: linq-to-sql entity-framework linq-to-entities


【解决方案1】:

两种方式:

  1. 可以使用返回表达式的方法
  2. 分离可查询位和可枚举位

对于 #1,请考虑:

public Expression<Func<Foo, bool>> WhereCreatorIsAdministrator()
{
    return f => f.Creator.UserName.Equals("Administrator", StringComparison.OrdinalIgnoreCase);
}

public void DoStuff()
{
    var exp = WhereCreatorIsAdministrator();
    using (var c = new MyEntities())
    {
        var q = c.Foos.Where(exp); // supported in L2E
        // do stuff
    }
 }

有关数字 2 的示例,请阅读这篇文章:How to compose L2O and L2E queries。考虑那里给出的例子:

var partialFilter = from p in ctx.People
                    where p.Address.City == “Sammamish”
                    select p;

var possibleBuyers = from p in partiallyFilter.AsEnumerable()
                     where InMarketForAHouse(p);
                     select p;

这可能效率较低,也可能没问题。这取决于你在做什么。预测通常没问题,但限制通常不行。

更新刚刚看到 Damien Guard 的an even better explanation of option #1

【讨论】:

【解决方案2】:

EF 无法根据包含方法的 LINQ 表达式编写查询。 EF 需要文字值来组成 SQL。

您将不得不处理返回给定案例所需实体的超集的“常见”查询,然后在从数据库返回后使用扩展方法和 LINQ 缩小返回集。

【讨论】:

  • 当您说“常见查询”时,您是指 IEnumerables 吗?例如有结果集而不是 IQueryable 的东西?
  • “通用查询”是指可用于返回所需实体的可管理大小的超集的参数化查询。您设计的查询将取决于您的数据以及您拥有多少。
  • 我明白了。但这意味着内存连接等?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多