实体框架包括大孩子为空的孩子

时间:2017-03-02 05:29:23

标签: c# linq asp.net-core entity-framework-6

看起来像一个简单的,但没有提出正确的事情。我需要做的就是获得一个子项目的计数,让它自己的孩子为null。以下是我一直在使用的内容:

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

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

  

InvalidOperationException:属性表达式' a => {来自[a] .expenses select中的费用p([p] .invoice == null)}'无效。表达式应代表属性访问权限:' t => t.MyProperty'

我将其更改为匹配,它只会触发新错误。

我只想获得一个award的列表,列出expenses列出的{{只有.ID,如果这会影响解决方案的话)invoice 1}}父对象未设置且为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()); } }
}

3 个答案:

答案 0 :(得分:1)

您必须与.Include一起使用.ThenInclude。文档清楚地解释了here(包括多个级别)。

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

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

答案 1 :(得分:0)

看来你知道自己在干嘛 有时它会发生,一封神奇的信件解决了噩梦般的问题...

一般情况下(你使用哪个版本的EF dunno), 据我所知,如此处所述

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

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

如果这些不是解决方案,那么切换你的电脑:) .. 然后只是在EF配置检查关系定义

抱歉还是不能评论出来。我不得不写答案......

答案 2 :(得分:0)

尝试重写这样的代码

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