【问题标题】:Works in LinqPad, but not in EF Core适用于 LinqPad,但不适用于 EF Core
【发布时间】:2016-12-23 16:48:23
【问题描述】:

这个简单的 linq 查询适用于 LinqPad 5,但不适用于 EF Core。 当我运行它时,我得到“System.NullReferenceException:对象引用未设置为对象的实例。”。但是靠什么?我检查了上下文,所有上下文都有数据。

var query = "kost";
var specialtyPageIds = 
(from pageSpecialty in Page_Specialties
join s in Specialties on pageSpecialty.SpecialtyId equals s.Id into ps
from s in ps.DefaultIfEmpty()
join cs in CustomSpecialties on pageSpecialty.CustomSpecialtyId equals cs.Id into pcs                                                                       
from cs in pcs.DefaultIfEmpty()
where s.Name.Contains(query) || cs.Name.Contains(query)
select pageSpecialty).ToList();

【问题讨论】:

  • 您可以在调试器中使用 Step-Into 来准确查看问题所在。我们真的无法提供更多帮助,因为几乎所有这些项目都可能为空。
  • 我刚刚意识到 SpecialtyId 和 CustomSpecialtyId 是可为空的整数。这可能是问题吗?
  • 这当然是可能的。如果您有办法在找到 null 时将它们强制为 0,那可能会解决您的问题。
  • 我得到了这个错误:public int Id { get;放;但它是由 db 自动生成的,所以它不能为 null 或 0。

标签: c# linq entity-framework-core


【解决方案1】:

您的查询没有问题,但 EF Core 仍然存在LEFT OUTER JOIN(和许多其他构造)查询翻译的问题。

作为一种解决方法,我可以建议基于 LINQ Any 条件的替代等效查询,该条件已成功转换为 SQL EXISTS

from ps in Page_Specialties
where Specialties.Any(s => s.Id == ps.SpecialtyId && s.Name.Contains(query)) ||
   CustomSpecialties.Any(cs => cs.Id == ps.CustomSpecialtyId && cs.Name.Contains(query))
select ps

【讨论】:

    猜你喜欢
    • 2021-04-19
    • 1970-01-01
    • 2019-05-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-13
    • 1970-01-01
    相关资源
    最近更新 更多