实体框架包括孙子项为 null 的子项



看似简单,但没有想出正确的方法。 我需要做的就是获取具有自己的子 null 的子项的计数。 这是我一直在使用的内容:

var data = await _context.award.Include(a => a.expenses.Select(p => p.invoice == null)).ToListAsync();

我也在这里尝试过其他组合,但没有运气。我得到的错误是

InvalidOperationException:属性表达式 'a => {from expense p in [a].expense select ([p].invoice == null)}' 无效。表达式应表示属性访问:'t => t.MyProperty'。

我更改它以匹配,它只会触发一个新错误。

我只想获取一个award列表,其中列出了expenses列表(如果影响解决方案,则只使用.ID),其中invoice父对象未设置并且null

更新请求的型号

public class invoice
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int ID { get; set; }
[ForeignKey("INV_NUM_ForeignKey")]
public invoice_number fin_invoice_number { get; set; }
}
public class invoice_number
{
[DatabaseGenerated(DatabaseGeneratedOption.Identity)]
public int ID { get; set; }
public int number { get; set; }
public invoice invoice { get; set; }
public string display { get { return string.Format("sps-{0}", (new String('0', 6) + number.ToString())).Substring(number.ToString().Count()-7, number.ToString().Count()); } }
}

您必须将.Include.ThenInclude一起使用。Docs 在这里解释得很清楚(包括多个级别)。

var data = await _context.award
.Include(a => a.expenses)
.ThenInclude(e => e.invoice)
.ToListAsync();

注意:但请注意,ThenInclude有两个重载,而且可能性很大,Visual Studio 会选择错误的一个或只显示一个(错误的一个),并在键入时给你错误,或者如果 e 不是集合,则不提供e自动竞争。如果忽略该错误并键入正确的属性并关闭括号,则错误将消失。

似乎你知道你在做什么,但是 有时它会发生,一封神奇的信解决了噩梦般的问题......

通常(您使用哪个版本的 EF dunno), 据我所知,就像这里描述的那样

https://msdn.microsoft.com/en-us/library/jj574232(v=vs.113).aspx

检查模型是否具有相关属性 急切或懒惰地决定...

如果不是解决方案,请切换您的计算机:).. 然后仅在 EF 配置中检查关系定义

抱歉仍然无法评论。我不得不写答案...

尝试像这样重写代码

var data = await _context.award.Include(a => a.expenses).Where(p => p.expenses.Any(a => a.invoice == null)).ToListAsync();

我正在使用.Net 6。

如果.ThenInclude抛出错误,因为您是父级,则为 null。然后你可以试试这个:


.Include(parent => parent.child)
.Include(parent => parent.child != null ? parent.child.grandChild : null);

最新更新