2017-03-02 81 views
0

看起来像一个简单的,但没有提出正确的事情。我需要做的就是获取具有自己的子空值的子项的数量。这是我一直在努力:实体框架包括大孩子为零的孩子

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

UPDATE 请求模型

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()); } } 
} 

回答

1

你必须使用.Include连同.ThenInclude。 Docs明确解释了here(包括多个级别)。

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

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

+0

的打动了我'ArgumentException的:酒店式“E =>(e.invoice == null)的是无效。表达式应该表示一个属性访问:'t => t.MyProperty'。' –

+0

删除括号 – Tseng

+0

你的模型是什么? – Tseng

0

看来你知道你在做什么,但 有时会发生与魔法字母解决问题的噩梦......

一般EF的(哪个版本你使用不知道), 据我所知,像这里描述的那样

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

检查你的模型相关的属性 主动或懒惰的决定......

如果thesee不解决,然后切换你的电脑:) .. 然后就在EF配置检查关联定义

对不起仍不能发表评论。我必须写回答...

0

尝试重新编写代码这样

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

Subscribe更多有关LINQ