【问题标题】:How to add a PredicateBuilder to my left outer join如何将 PredicateBuilder 添加到我的左外连接
【发布时间】:2014-05-09 18:09:31
【问题描述】:

我在表 UnitsGeoLocationsUnitStatuses 之间有以下基于左外连接的 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,但我对两件事有点困惑。

  1. 鉴于我上面的陈述,我实际上如何添加以下谓词:

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

    我想我可以像var currentUnitResults = (from unit....).Where(searchPredicate) 一样添加它,但这不起作用,因为它已经将前导语句评估为IQueryable&lt;AnonymousType&gt;

  2. 鉴于我的联接,如何在其中一个联接表上正确添加谓词,以便我还可以编写如下语句:

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

衷心感谢您对此提供的任何帮助/指导。

【问题讨论】:

    标签: c# asp.net .net linq predicatebuilder


    【解决方案1】:

    因为您的谓词预计将用于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(...
    

    【讨论】:

      猜你喜欢
      • 2023-03-04
      • 2012-11-25
      • 2014-02-24
      • 2012-10-31
      • 2018-06-01
      • 1970-01-01
      • 2019-06-18
      • 1970-01-01
      • 2011-10-01
      相关资源
      最近更新 更多