【发布时间】:2014-05-09 18:09:31
【问题描述】:
我在表 Units、GeoLocations 和 UnitStatuses 之间有以下基于左外连接的 LINQ 查询:
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();
我想添加能够动态添加谓词以有条件地返回项目。我发现在 StackOverflow 上的各个地方都建议使用 PredicateBuilder,但我对两件事有点困惑。
-
鉴于我上面的陈述,我实际上如何添加以下谓词:
var searchPredicate = PredicateBuilder.True<Unit>(); searchPredicate = searchPredicate.And(u => u.geo_location.Latitude >= swLat);我想我可以像
var currentUnitResults = (from unit....).Where(searchPredicate)一样添加它,但这不起作用,因为它已经将前导语句评估为IQueryable<AnonymousType>。 -
鉴于我的联接,如何在其中一个联接表上正确添加谓词,以便我还可以编写如下语句:
searchPredicate = searchPredicate.And(loc => loc.city.Contains("Pittsburgh"));
衷心感谢您对此提供的任何帮助/指导。
【问题讨论】:
标签: c# asp.net .net linq predicatebuilder