2013-05-13 167 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的價值和工藝的變化,當你回來後。