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的酒店。这怎么可能?请帮助
这是一个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
})
假设您的HotelType
是int
,您可以这样做。
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
});