【问题标题】:EfCore ToListAsync() Throw exception with where conditionEfCore ToListAsync() 在 where 条件下抛出异常
【发布时间】:2018-11-02 17:46:03
【问题描述】:

我有一个异步任务的问题,该任务从数据库中获取具有特定条件的项目 当我调用 ToListAsync() 时出现此错误

“System.Collections.Generic.IAsyncEnumerable1[System.Guid]' cannot be used for constructor parameter of type 'System.Collections.Generic.IEnumerable1[System.Guid]”类型的表达式 参数名称:arguments[0]

这是代码sn-p:

public async Task<IEnumerable<Parent>> GetItems(List<Guid> TypeIds)
{
    var items = context.Parent.Include(x => x.Child).Where(x => new HashSet<Guid>(x.Child.Select(y => y.TypeId).Distinct()).SetEquals(new HashSet<Guid>(TypeIds)));
    return await items.Include(x=> x.Child).ToListAsync();
}

如果我实现这个方法不是async 我不会得到错误并且一切正常。

【问题讨论】:

  • 你不能拥有像实体框架那样的Where lambda。

标签: c# asynchronous entity-framework-core ef-core-2.0


【解决方案1】:

你不能拥有像实体框架那样的Where lambda,记住表达式将被转换为不知道HashSet 是什么的 SQL。您可能正在寻找类似的东西:

var items = context.Parent
    .Include(x => x.Child)
    .Where(x => x.Child.Any(y => TypeIds.Contains(y.TypeId)));

【讨论】:

  • 请注意,这是 EF Core,因此您可以拥有任何类型的 lambda。如果它不能被翻译成 SQL,它将在本地进行评估。效率如何是另一回事:) 无论如何,如果 OP 声称非异步版本有效而​​异步无效,那么它只是另一个 EFC 错误。
  • @IvanStoev 呃,我一直忘记 EFC 的行为是这样的,我讨厌它!
  • 哈哈,我也是!从一开始就。但它允许他们“发布” EFC,而无需为许多结构完全实现 SQL 翻译,GroupBy 是最著名的。
  • @IvanStoev 总的来说,我确实喜欢 .NET Core,但这肯定是他们做出的最糟糕的选择之一(如果不是 the 最糟糕的)。现在我们永远坚持下去:/
  • @DavidG 在我的情况下,您建议的 lambda 不起作用,因为我需要在 TypeIds 和 Iqueryable 中传递的确切类型 Child 的父级,我得到了我需要的项目。问题出在 ToListAsync()
猜你喜欢
  • 1970-01-01
  • 2015-07-14
  • 2015-06-02
  • 1970-01-01
  • 2013-05-24
  • 2011-10-12
  • 1970-01-01
  • 2023-01-19
  • 2022-01-23
相关资源
最近更新 更多