使用linq过滤子子集合

时间:2012-09-11 21:40:24

标签: c# linq

我有以下结构,

事件(PARENT)并具有以下字段; ID,EventName

EventProcess(CHILD)具有以下字段; ID EventID(FK),EventProcessName

EventProcessForms(GRANDCHILD)具有以下字段; ID,eventProcessID,FormID

Forms-具有以下字段,ID,FormName

我试图仅返回EventProcess具有存储在EventProcessForms表中的Forms的事件?

如何使用linq返回集合?

感谢您的帮助

3 个答案:

答案 0 :(得分:2)

听起来你需要深入两个层次:

events.Where(
    e => e.EventProcesses.Any(
        ep => ep.EventProcessForms.Any()
        )
    );

如果其中任何一个属性为null,则更改为:

events.Where(
    e => e.EventProcesses != null && e.EventProcesses.Any(
        ep => ep.EventProcessForms != null && ep.EventProcessForms.Any()
        )
    );

如果您只想过滤到具有表单的 Processes ,您将使用foreach修改Event实体,或者创建新的Event对象选择已过滤的进程:< / p>

events.Select(e=> new Event() {
         ID = e.ID, 
         Name = e.Name, 
         EventProcesses = e.EventProcesses.Where( 
             ep => ep.EventProcessForms.Any())
    .Where(e=>EventProcesses.Any())
    ;

答案 1 :(得分:0)

我编辑了我的答案:

using (yourDataContext db = new yourDataContext());
{    
    var results = db.Event.Where(e -> e.EventProcess.EventProcessForms.count() > 0);
}

答案 2 :(得分:0)

类似的东西:

var q = from @event in events 
    where @event.EventProcess.EventForms.Count() > 0 
    select @event;

也可以表示为:

    var q = from @event in events
            where @event.EventProcess.EventForms.Any()
            select @event;

在没有某种实际类的情况下猜测基于...的属性