Entity Framework include children that grand children are null

问题描述 投票:0回答:4

看起来很简单,但没有想出正确的东西。我需要做的就是计算自己的子项为 null 的子项的数量。这是我一直在使用的:

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

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

InvalidOperationException:属性表达式 'a => {from expense p in [a].expenses 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()); } }
}
c# linq asp.net-core entity-framework-6
4个回答
3
投票

您必须将

.Include
.ThenInclude
一起使用。文档解释得很清楚这里(包括多个级别)。

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

Notice:但是请注意,

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


0
投票

看起来你知道自己在做什么,但是 有时它会发生,一封神奇的信可以解决噩梦般的问题......

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

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

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

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

对不起还是不能评论。我不得不写答案...


0
投票

我正在使用 .Net 6.

如果

.ThenInclude
抛出错误,因为您的父级为空。那么你可以试试这个:


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

-1
投票

尝试像这样重写你的代码

var data = await _context.award.Include(a => a.expenses).Where(p => p.expenses.Any(a => a.invoice == null)).ToListAsync();
© www.soinside.com 2019 - 2024. All rights reserved.