繁体   English   中英

实体框架包含子代,即子代为空

[英]Entity Framework include children that grand children are null

看起来很简单,但却没有提出正确的建议。 我需要做的就是获取拥有自己的子null的子项计数。 这是我一直在处理的内容:

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

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

InvalidOperationException:属性表达式'a => {来自[a] .expenses select([p] .invoice == null)中的费用p}}'无效。 该表达式应表示属性访问:“ 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不是a则不为e提供自动竞争采集。 如果忽略该错误并输入正确的属性并关闭方括号,该错误将消失。

看来您知道自己在做什么,但有时会发生,并且一封魔术字母可以解决噩梦问题...

据我所知,一般来说(EF的哪个版本使用dunno),如此处所述

https://msdn.microsoft.com/zh-CN/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();

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM