C# 在include generate error中使用where子句;Include path表达式必须引用在类型“”上定义的导航属性;

C# 在include generate error中使用where子句;Include path表达式必须引用在类型“”上定义的导航属性;,c#,linq,entity-framework,C#,Linq,Entity Framework,我想在获取账单时筛选附件: var billing = db.Billings .Include(b => b.Client) .Include(b => b.Attachments.Where(a => a.WorkflowStateID == workflowStateID)) .Where(b => b.BillingID == id) .

我想在获取账单时筛选附件:

var billing = db.Billings
                .Include(b => b.Client)
                .Include(b => b.Attachments.Where(a => a.WorkflowStateID == workflowStateID))
                .Where(b => b.BillingID == id)
                .FirstOrDefault();
计费实体:

public partial class Billing
    {
        public Billing()
        {
            this.Attachments = new HashSet<Attachment>();
        }

        public long BillingID { get; set; }
        public int ClientID { get; set; }

        public virtual ICollection<Attachment> Attachments { get; set; }
        public virtual Client Client { get; set; }
    }
如何使用include上的
where
子句? 我想要实现的是,如果我在查询sql中进行翻译:

select * 
from Billing b
    inner join Client c on b.ClientID = c.ClientID
    inner join (select * from Attachment a where a.WorkflowStateID = @workflowStateID) t on b.BillingID = t.BillingID
where b.BillingID = @billingID

如上所述,不允许使用
其中
内部包含方法。据我所知,这样过滤导航属性是不可能的。你能做的就是使用投影

var billing = db.Billings
    .Where(b => b.BillingID == id)
    .Select(b => new {
        Billing = b,
        BillingClient = b.Client
        FilteredAttachments = b.Attachments.Where(a => a.WorkflowStateID == workflowStateID)
    })
    .FirstOrDefault();

简单回答:你不能。看看这个问题好吧,我明白了,但为什么我不能用这种方式访问客户端。客户端?这个答案是错误的,正如@Willy的评论:
Include
没有效果,因为投影
db.Billings.Where(b=>b.BillingID==id)。选择(b=>new{Billing=b,BillingClient=b.Client,FilteredAttachments=…)。FirstOrDefault()
应该可以工作(并且应该确保
Billing.BillingClient
Billing.Billing.Client
都可以设置)@hvd感谢您的更正,所以它不需要。包括(b=>b.Client)作为替换使用BillingClient=b.Client,我说的对吗?是的,但正如我在评论中指出的,您不必实际使用
BillingClient
,仅是这样检索它就足以确保
Client
属性也得到设置。
var billing = db.Billings
    .Where(b => b.BillingID == id)
    .Select(b => new {
        Billing = b,
        BillingClient = b.Client
        FilteredAttachments = b.Attachments.Where(a => a.WorkflowStateID == workflowStateID)
    })
    .FirstOrDefault();