2014-05-10 5 views
0

J'utilise Linq to Entities et moi avons quelque chose comme la requête cerequête Linq clause 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 
      }) 

J'utilise .ToString() dans where article que je sais est pas valable lorsque le travail avec Linq To Entities. Mais en réalité la colonne "HotelType" a des valeurs séparées par des caractères de pipe comme 1 | 2 | 3..Maintenant je veux extraire seulement les hôtels qui ont un type 1. Comment est-ce possible? S'il vous plaît aider

+3

Tout d'abord, vous devez modifier la structure de vos tables. Il n'est pas bon d'enregistrer '1 | 2 | 3' dans une cellule. Vous pouvez créer une autre table avec le nom 'HotelTypes' avec au moins deux colonnes:' Hotel_ID' et 'Type_ID'. Ensuite, utilisez la jointure à cette table. –

+0

J'ai une très grande base de données, c'est assez difficile en ce moment. Je me demande si je peux le rendre possible –

+0

Envisager de rendre le titre de la question plus spécifique. Celui-ci ne décrit vraiment pas votre problème du tout. –

Répondre

3

C'est un hack mais cela devrait fonctionner.

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

Il tourne d'abord 1|2|3 en |1|2|3| et cherche ensuite |1| ou |2| et fonctionnera, peu importe si l'ID est la première ou la dernière ou quelque part au milieu. Mais vous devriez vraiment restructurer votre base de données - c'est généralement une très mauvaise idée d'avoir des informations encodées comme ça et vous avez déjà découvert parce que vous deviez demander comment faire quelque chose qui devrait être trivial.

+0

Je reçois cette erreur maintenant: Impossible de convertir le type 'System.Int32' pour taper 'System.Object'. LINQ to Entities ne prend en charge que la diffusion de types de primitives EDM ou d'énumération. –

+0

Ajout de l'appel 'ToString()' - Je pensais que vous pouvez l'omettre mais peut-être pas. –

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

En supposant que votre HotelType est int vous pouvez le faire.

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