Linq查询where子句

本文关键字:子句 where 查询 Linq | 更新日期: 2023-09-27 18:02:51

我使用Linq to Entities,我有一个类似这样的查询

context.Hotels
        .Where(h => h.HotelType.Contains(s.HotelTypeId.ToString()))
        .Select(hotel => new Model.Hotel
           {
              HotelId = hotel.HotelID,
              HotelName = hotel.HotelName,
              HotelFileName = hotel.HotelFileName,
              StarRating = hotel.StarRating,
              CountryName = hotel.Country.CountryName,
              PlaceName = hotel.Place.PlaceName
           })

我在where子句中使用.ToString(),我知道Linq To Entities工作时无效。但实际上"HotelType"列的值用管道字符分隔,如1|2|3..现在我只想提取那些类型为1的酒店。这怎么可能?请帮助

Linq查询where子句

这是一个hack,但它应该工作。

Where(h => ("|" + h.HotelType + "|").Contains("|" + s.HotelTypeId.ToString() + "|"))

它首先将1|2|3转换为|1|2|3|,然后寻找|1||2|,无论ID是第一个还是最后一个或中间的某个地方,它都将工作。

但是你真的应该重构你的数据库——把信息编码成那样通常是一个非常糟糕的主意,你已经发现了,因为你不得不问如何做一些应该是微不足道的

同样值得注意的是,EF 6.1支持ToString()http://blogs.msdn.com/b/adonet/archive/2014/03/17/ef6-1-0-rtm-available.aspx

context.Hotels
    .Where(h => h.HotelType.Split('|').Select(str=>Convert.ToInt32(str)).Contains(s.HotelTypeId))
    .Select(hotel => new Model.Hotel
       {
          HotelId = hotel.HotelID,
          HotelName = hotel.HotelName,
          HotelFileName = hotel.HotelFileName,
          StarRating = hotel.StarRating,
          CountryName = hotel.Country.CountryName,
          PlaceName = hotel.Place.PlaceName
       })

假设您的HotelTypeint,您可以这样做。

context.Hotels
    .Where(h => h.HotelType.Split("|").Select(ht=>int.Parse(ht))
    .Contains(s.HotelTypeId))
    .Select(hotel => new Model.Hotel
       {
          HotelId = hotel.HotelID,
          HotelName = hotel.HotelName,
          HotelFileName = hotel.HotelFileName,
          StarRating = hotel.StarRating,
          CountryName = hotel.Country.CountryName,
          PlaceName = hotel.Place.PlaceName
       });