2013-05-13 168 views
2

所以我深感困惑。我有两个表,一个是位置分配,它包括:位置标识,类型和类型标识。我也有一个名为services的表,它由名称,ID,描述和图标组成。左外连接实体/ Linq

想法是说,让我回来所有13个服务,从我们创建13个复选框。那么我们说,检查位置分配表,如果这个服务(基于类型,ID和位置ID)与该列表中的一个服务相匹配,选中该复选框,否则不要选中它。

我至今ahve是:

public static IEnumerable<Constants.Assignable> getAllService(int id) 
    { 
     List<Constants.Assignable> assign = new List<Constants.Assignable>(); 

     using (var db = new Context()) 
     { 
      var serv = from s in db.Services 
         join la in db.LocationAssignments on s.id equals la.typeId into LocationAssignments 
         from la in LocationAssignments 
         where la.locationId == id && s.id == la.typeId && la.type == Constants.SERV 
         select s; 

      foreach(var s in serv) 
      { 

       assign.Add(new Constants.Assignable(){ 
        id = s.id, name = s.name 
       }); 
      } 

      return assign; 
     } 
    } 

返回我的,目前,两个服务,当它应该返回我13.因此,有什么问题我加入。

从那里我们这样做:

<h3 class="muted">Services Nearby</h3> 
    IEnumerable<UFA.Location.Core.Constants.Assignable> ServicesNearby = UFALocationApp.Helpers.LocationHelper.QueryHelper.getAllServicesNearby(Model.id); 
    foreach (var servicenb in ServicesNearby) 
    { 
     <div class="control-group"> 
      <label class="control-label" for="serviceNearBy"> 
      @servicenb.name 
      </label> 
      <div class="controls"> 
       <input type="checkbox" id="Locationservice" value="@servicenb.id" name="serviceNB" checked="@(servicenb.assigned ? "checked" : "")" /> 
      </div> 
     </div> 
    } 

能打印出两个复选框是,在这种情况下进行检查。应该还有11个未被检查的。

我在查询中有什么要改变的地方要说:请给我所有的服务,只检查与这个位置相关的服务吗?

+0

http://stackoverflow.com/questions/3404975/left-outer-join-in-linq的副本 – gunr2171 2013-05-13 20:34:01

回答

0

要使其成为LEFT JOIN,您需要使用DefaultIfEmpty(),看起来您错过了使该功能工作的组件;

var serv = from s in db.Services 
      join la in db.LocationAssignments on s.id equals la.typeId 
       into LocationAssignments 
      from la in LocationAssignments.DefaultIfEmpty() 
      where la.locationId == id && s.id == la.typeId 
       && la.type == Constants.SERV 
      select s; 
0

如果我看到你以及你这样的事情之后是:

var assign = (from s in db.Services 
       select new Constants.Assignable 
       { 
        id = s.id, 
        name = s.name, 
        checked= db.LocationAssignments.Any(la => la.typeId == s.id) 
       }).ToList(); 

现在,您可以通过点击复选框改变checked的价值和工艺的变化,当你回来后。