2014-05-09 25 views
0

我有以下左外基礎加盟,LINQ表UnitsGeoLocations之間UnitStatuses查詢和:如何將PredicateBuilder添加到我的左外連接

var currUnitResults = (from unit in pacificRepo.Units 
         join loc in pacificRepo.GeoLocations on new { unit.geo_location.Latitude, unit.geo_location.Longitude } equals new { loc.geo_location.Latitude, loc.geo_location.Longitude } 
         join st in pacificRepo.UnitStatuses on unit.c_number equals st.c_number into stj 
         from sublist in stj.DefaultIfEmpty() 
         select new 
         { 
          index = "0", 
          unit.c_number, 
          unit.serial_number, 
          unused = unit.location_at_address, 
          unit.ip_address, 
          unit.build_version, 
          status = (sublist.status == Pacific.Domain.Entities.UnitStatus.Statuses.COMPLETE) ? "<font color=\"green\">" + sublist.stage + "</font>" : "<font color=\"red\">" + sublist.stage + "</font>", 
          location = (loc == null) ? "Unknown" : loc.city + ", " + loc.state_abbrv, 
          unit.location_at_address, 
          latitude = unit.geo_location.Latitude, 
          longitude = unit.geo_location.Longitude 
         }).OrderBy(p => p.c_number).Skip(param.iDisplayStart).Take(param.iDisplayLength).ToList() 
         .Select(x => new object[] { 
          x.index, x.c_number, x.serial_number, x.unused, x.ip_address, x.build_version, x.status, x.location, x.location_at_address, x.latitude, x.longitude 
         }).ToList(); 

我要添加能夠動態地添加謂詞有條件地返回物品。我發現PredicateBuilder會在StackOverflow的各個地方被推薦,但我對兩件事情有些困惑。

  1. 鑑於我上述說法,實際上,我怎麼添加以下語句到它:

    var searchPredicate = PredicateBuilder.True<Unit>(); 
    searchPredicate = searchPredicate.And(u => u.geo_location.Latitude >= swLat); 
    

    我以爲我可以像var currentUnitResults = (from unit....).Where(searchPredicate)添加它,但是,這並不工作,因爲它已經評估領導發言到IQueryable<AnonymousType>

  2. 給我的加盟,我該如何正確添加的連接表中的一個斷言,這樣我也可以寫這樣一份聲明:

    searchPredicate = searchPredicate.And(loc => loc.city.Contains("Pittsburgh")); 
    

任何幫助/指導表示衷心感謝在這。

回答

0

因爲你的謂語預計將在Units使用,也許你可以嘗試這樣的事:

var currUnitResults = pacificRepo.Units 
    .Include(u => u.UnitStatuses) 
    .Join(pacificRepo.GeoLocations, 
     u => new { u.geo_location.Latitude, u.geo_location.Longitude }, 
     g => new { g.geo_location.Latitude, g.geo_location.Longitude }, 
     (u, g) => new { u, g }) 
    .Where(searchPredicate) 
    .OrderBy(...