2014-05-10 186 views
0

我使用Linq to Entities和我有一个查询是这样的Linq查询的WHERE子句

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工作。 2 | |但实际上,“HotelType”列有值与管的人物,如1分离3..Now我想提取只有那些有型1..How是有可能的酒店?请帮助

+3

首先,您必须更改您的表格结构。在一个单元中保存'1 | 2 | 3'并不好。您可以创建另一个名为'HotelTypes'的表,并至少包含两列:'Hotel_ID'和'Type_ID'。然后使用加入到此表。 –

+0

我有一个非常大的数据库,这个时候很难。我想知道如果不知何故,我可以使人们有可能 –

+0

考虑将问题的标题更具体。这个真的没有描述你的问题。 –

回答

3

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

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

它首先变成1|2|3|1|2|3|,然后查找|1||2|,并将努力不管ID是第一个或最后或中间的某个位置。

但你真的应该调整你的数据库 - 它通常是一个非常糟糕的主意,有编码这样的消息,你已经发现了,因为你不得不问如何做一些事情,应该是微不足道的。

+0

我现在收到此错误:无法投类型“System.Int32”输入“System.Object的”。 LINQ to Entities仅支持投射EDM基元或枚举类型。 –

+0

加回'的ToString()'调用 - 我想你能离开它,但也许不是。 –

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 
     }) 
0

假设你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 
     });