如何结合linq查询和选择不同的记录?

时间:2012-03-26 13:13:11

标签: linq entity-framework lambda entity-framework-4.1

我有一个可以为其分配一个用户或工作组的对象。可以直接或通过工作组分配用户,但是对象永远不能同时设置。

public class Procedure
{
      .....
      public Guid? AssignedToId {get;set;} //Foreign Key to AssignedTo
      public Contact AssignedTo {get;set;} //Single user assignment
      public Guid? AssignedWorkGroupId {get;set;} //Foreign Key to AssignedWorkGroup
      public WorkGroup AssignedWorkGroup {get;set;} //Multiple user assignment
      public Guid? AssignedBuisnessPartnerId {get;set;}
      public BusinessPartner AssignedBuisnessPartner {get;set;}

}

我试图弄清楚如何编写单个查询,在那里我可以找到可以直接分配用户或者是分配的工作组的一部分的过程。目前我有两个单独的查询,并结合我回来的列表。哪个有效,但可能效率不高。

以下是我现在所拥有的:

var procedures =  _procedureRepository.Get(p => p.AssignedToId == assignedId).ToList();

procedures.AddRange(_procedureRepository.Get(p => p.AssignedWorkGroup.Contacts.Select(c => c.Id).Contains(assignedId) || p.AssignedBuisnessPartner.Contacts.Select(c => c.Id).Contains(assignedId));

1 个答案:

答案 0 :(得分:1)

看起来你在sql中寻找Union All,这相当于linq中的Concat。以下代码仅执行对数据库的一次调用。不确定它是否会比您当前的方法更快。

var procedures2 = _procedureRepository.Get(p => p.AssignedWorkGroup.Contacts
                                                                   .Select(c => c.Id)
                                                                   .Contains(assignedId) || 
                                                p.AssignedBuisnessPartner.Contacts
                                                                         .Select(c => c.Id)
                                                                         .Contains(assignedId));

var procedures = _procedureRepository.Get(p => p.AssignedToId == assignedId)
                                     .Concat(procedures2);