我正在使用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
})
我在.ToString()
子句中使用where
,我知道在使用Linq To Entities
时无效。但实际上“HotelType”列的值用管道字符分隔,例如1 | 2 | 3.现在我只想提取那些类型为1的酒店。怎么可能?请帮忙
答案 0 :(得分:3)
这是一个黑客,但它应该工作。
Where(h => ("|" + h.HotelType + "|").Contains("|" + s.HotelTypeId.ToString() + "|"))
首先将1|2|3
转换为|1|2|3|
然后查找|1|
或|2|
,无论ID是第一个还是最后一个还是中间的某个位置,它都会有效。
但是你真的应该对你的数据库进行重构 - 通常一个非常糟糕的主意是让信息编码完成并且你已经发现了,因为你不得不问如何做一些应该是微不足道的事情。
答案 1 :(得分:0)
值得注意的是,EF 6.1支持ToString() http://blogs.msdn.com/b/adonet/archive/2014/03/17/ef6-1-0-rtm-available.aspx
答案 2 :(得分:0)
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
})
答案 3 :(得分:0)
假设您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
});