【问题标题】:EntityFramework Core 6.0 Linq Group Join problem ( on "into" word) [duplicate]EntityFramework Core 6.0 Linq Group Join 问题(关于“进入”字)[重复]
【发布时间】:2022-01-27 01:12:16
【问题描述】:

我正在使用 EF Core 6.0 框架。我正在编写 Web API。我想像下面的代码一样加入城市和城镇实体。
但是如果我在 LinQ 查询中像这样“into tmpTownArr”这样使用“into”字,程序就会崩溃(它给 GroupJoin Error,我写在图片下面)

在下面的图片 1 和 3 不工作,但 No 2 和 4 工作

1号错误代码:

The LINQ expression 'DbSet<City>()
.GroupJoin(
    inner: DbSet<Town>(), 
    outerKeySelector: c => c.Id, 
    innerKeySelector: t => t.CityId, 
    resultSelector: (c, tmpTownArr) => new { 
        c = c, 
        tmpTownArr = tmpTownArr
     })' could not be translated. Either rewrite the query in a form that can be translated, or switch to client evaluation explicitly by inserting a call to 'AsEnumerable', 'AsAsyncEnumerable', 'ToList', or 'ToListAsync'. See https://go.microsoft.com/fwlink/?linkid=2101038 for more information.

【问题讨论】:

  • 您能否将代码发布为文本而不是屏幕截图?将您的 插入为 cmets。
  • 我想,我怕是的... :(( (Svyatoslav Danyliv)

标签: c# api linq left-join ef-core-6.0


【解决方案1】:

为什么不重新定义如何使用 EF 并使用导航属性而不是手动连接?

你的问题可以简化为

var townCities = await context.Set<City>.Select(c => new { c, c.Towns }).ToListAsync();

【讨论】:

  • 我将在未来编写复杂的查询。所以我不能使用你的解决方案。 (我的问题不是城镇与城市。如果我使用上面的第 2 项,我可以得到它们)我的问题是我无法在 Linq Query 中使用单词。
  • 我的意思是,如果您的模型具有正确定义的导航属性,则无需显式加入。像 EF 这样的东西的意义在于将程序员从手动编写连接语句中解放出来。
  • 您还必须考虑到 linq 必须将您的请求转换为 SQL 语句;并非 .net 中的所有内容在 SQL 中都有等效项。不幸的是,您的临时 c# 变量对 linq 意义不大。
【解决方案2】:

简短的回答是您编写的 Linq 无法翻译成 SQL。

解决此问题的一种方法是使用 AsEnumerable(),但要小心,因为它有很多潜在的不良副作用。

否则,您需要想出另一种方法。

【讨论】:

    猜你喜欢
    • 2020-10-12
    • 2015-02-16
    • 1970-01-01
    • 1970-01-01
    • 2011-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多