【问题标题】:Linq where clause in select new选择新的Linq where子句
【发布时间】:2019-02-27 23:20:46
【问题描述】:

我有 2 张桌子,我们称它们为 t1 和 t2。 t1 有一个 ID、一个字符串和一个布尔值。 t2 有一个 ID、一个日期和一个 t1.ID。 我想把它们放在我班级的列表中。

public class MyClass {
    public string Name {get; set;}
    public DateTime Date1 {get; set;}
    public Datetime Date2 {get; set;}
}

(它有 15 个日期,为了让它更小,我只放了两个)

我找到了解决办法:

List<MyClass> list = (from t2 in con.t2
                      join t1 in con.t1 on t2.T1ID equals t1.ID
                      select t2).GroupBy(d => d.T1ID).Select(x => new MyClass()
{
    Name = x.FirstOrDefault().t1.Name,
    Date1 = x.where(d => d.ID == 1).SingleOrDefault().Date,
    Date2 = x.where(d => d.ID == 2).SingleOrDefault().Date
}).ToList();

它按预期工作,但问题是,我从 Visual Studio 收到此警告:

无法翻译 LINQ 表达式“GroupBy([t2].T1ID)”并且 将在本地进行评估。

它出现了好几次。此消息也适用于 SingleOrDefault。我进行了一些测试,如果我将 where 放在 select new 中,它就会出现。

那么我该如何改变我的表情来避免这种情况呢?还是我的表情很糟糕,我本可以做得更好? (我不能改变表结构)

【问题讨论】:

  • 这是由于 EF Core 还不“知道”如何将其转换为 SQL。 EF Core 团队正在对每个版本进行改进,但仍有许多内容在内存中进行评估。请注意该警告,因为评估内存中的内容可能会导致您分配大量内存并随着表的增长而出现严重的性能问题。如果您无法以 EF Core 可以将其转换为 SQL 的方式重写查询,则可以使用 EF Core 中的Raw SQL 功能
  • @Tyimi 生成 JOIN 是 ORM 的工作。像这样使用 LINQ 清楚地表明实体之间缺少关系。 ORM 也不适用于报告场景。
  • @TYimi 你想用这个查询做什么?即使在 SQL 中,它看起来也很奇怪。看起来 JOIN 返回的行数比需要的多,因此您必须使用 FirstSingle 删除重复项。为什么不写一个 SELECT Name,ID,MIN(DATE) FROM T2 WHERE ID IN (1,2) GROUP BY Name,ID ? JOIN 似乎只是为了返回另一个表中存在的行
  • 我想在一行中获取 t1 中 ID 的日期。 t2 中的 ID 不是真实 ID,因为它不是唯一的。因此,T1 中的每一行在 T2 中都有 15 个日期,ID 为 1-15。

标签: c# linq entity-framework-core


【解决方案1】:

我相信这仍然是 EF 的限制。请注意查询使用的内存,因为警告会提醒您这样做。

问候。

【讨论】:

  • 大约有 350 行。未来不会更多。
  • @Tyimi 即使在 SQL 中,查询也会看起来很奇怪。解释你试图用它来完成什么。很可能有更简单的方法来编写它。 350 听起来也很像与日期相关的查询。
猜你喜欢
  • 1970-01-01
  • 2014-09-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-12-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多