代码之家  ›  专栏  ›  技术社区  ›  Caimen

如何使用linq to sql中的列表创建动态where子句?

  •  0
  • Caimen  · 技术社区  · 14 年前
     var query_loc = (from at in db.amenities_types
                         join a in db.amenities on at.id equals a.amenities_type
                         join u in db.unitInfos on a.unit_id equals u.id
                         join l in db.locations on u.locations_id equals l.id
                         join o in db.organizations on l.organization_id equals o.id
                         join ot in db.organization_types on o.id equals ot.organization_id
                         where (((u.price >= low_rent) && (u.price <= high_rent)) 
                                  || (u.price == null))
                         && (u.bedrooms <= beds) && (u.bathrooms <= baths)
                         && amenities_list.Contains(at.id)
                         && (((ot.active == true) && (DateTime.Now <= ot.deactivateDate))
                              || ((ot.active == true) && (ot.deactivateDate == null)))
                             && (((l.active == true) && (DateTime.Now <= l.deactivateDate))
                              || ((l.active == true) && (l.deactivateDate == null)) )
                         && (ot.type == 8)
                         orderby o.name ascending, l.name ascending
                         select new { l, o, u, ot, at });
    

    我需要替换的具体行是

    在哪里? 便利设施清单包含(at.id)

    相反,它需要生成这样的SQL([at.id]=29和[at.id]=30和[at.id]=40)

    那么,如何让我的列表在linq to sql中生成上面的SQL代码呢?

    1 回复  |  直到 14 年前
        1
  •  0
  •   Jimmy Hoffa    14 年前

    请为你的条款创建方法,你吓到我了。

    var query_loc = (from at in db.amenities_types 
                     join a in db.amenities on at.id equals a.amenities_type 
                     join u in db.unitInfos on a.unit_id equals u.id 
                     join l in db.locations on u.locations_id equals l.id 
                     join o in db.organizations on l.organization_id equals o.id 
                     join ot in db.organization_types on o.id equals ot.organization_id 
                     where
                        PriceIsValid(u)
                     && BedsAndBathsArevalid(u) 
                     && AtIdIsValid(at.id)
                     && SomeCrazyDateConditionIsValid(ot, l)
                     && TheOtTypeIsValid(ot)
                     orderby o.name ascending, l.name ascending 
                     select new { l, o, u, ot, at }); 
    

    如果您的意思是at.is=29或at.id=30或at.id=40,那么使用atidisvalid(at.id)谓词,如:

    bool AtIdIsValid(int atId){ return (atId == 29 || atId == 30 || atId == 40); }