Majid joghataey
Majid joghataey

Reputation: 1537

Get multiple data from tables Using Entity Framework

public ActionResult Hotel_Read(string text)
{
    var result = GetHotel().Where(c => c.Name.Contains(text) || c.City.Contains(text) || c.Country.Contains(text)).ToList();
    return Json(result, JsonRequestBehavior.AllowGet);
}

private static IEnumerable<HotelViewModel> GetHotel()
{
    using (TravelAgancyEntities1 db = new TravelAgancyEntities1())
    {
        var query = db.Hotels
                      .Include(p => p.City.Country).Distinct().ToList();

        return query.Select(Hotel => new HotelViewModel
         {
             Name = Hotel.Name,
             City = Hotel.City.City_Name,
    **Line 10-** Country = Hotel.City.Country.Country_Name,//!!!

         });
    }
}

When I run the code without line 10, it is working successfully, but when that code is run with line 10, then it's not working.

enter image description here

Upvotes: 2

Views: 1340

Answers (2)

Alex Art.
Alex Art.

Reputation: 8781

You don't need Includes here because there is no application logic involved in creation of HotelViewModel instances.

Simple query:

db.Hotels.Select(h => new HotelViewModel
         {
             Name = h.Name,
             City = h.City.City_Name,
             Country = h.City.Country.Country_Name,
         }).ToList();

Will return from the DB exactly the data that you need.

When you first do Includes, and then call ToList();:

var query = db.Hotels.Include(p => p.City.Select(x => x.Country))
                     .Distinct()
                     .ToList(); 

You fetch form DB all the Hotel properties, all the City properties and all the Country properties while all you really need is only their names.

Upvotes: 0

M.Armoun
M.Armoun

Reputation: 1165

I assume your code should run properly. the only thing that makes me suspicious, is that you are trying to retrieve all Hotel table data plus 2 other table(with include)
try this :

var q = (from x in db.Hotels.Include(c => c.City).Include(c =>  c.City.Country)
                         where x.Id == 5030
                         select x).Distinct().ToList();
string s = q[0].City.Country.Country_Name;

Limit your select with Where clause.

Upvotes: 1

Related Questions