Многостоловый запрос LINQ - возвращаются только 2 из 3 таблиц - PullRequest
0 голосов
/ 11 июля 2011

ЗАПРОС: Я хочу вернуть все рестораны с CUISINE__BANE = cusisineName независимо от города, в котором они расположены.Мой запрос возвращает таблицы RESTAURANT и CITY, но не таблицу CUISINE.Ваша помощь очень ценится!

public class DLgetRestaurants
    {
        DL.FVRGDataContext db = new FVRGDataContext();

        public List<RESTAURANT> getRestaurants(string cuisineName)
        {
            var cuisineID = db.CUISINEs.First(s => s.CUISINE_NAME == cuisineName).CUISINE_ID;

            List<RESTAURANT> result = (from RESTAURANT in db.RESTAURANTs
                                       join CITY in db.CITies on RESTAURANT.CITY_ID equals CITY.CITY_ID
                                       join CUISINE in db.CUISINEs on RESTAURANT.CUISINE_ID equals CUISINE.CUISINE_ID
                                       where RESTAURANT.CUISINE_ID == cuisineID
                                       select RESTAURANT).ToList();

             return result;
        }
    }

Ответы [ 3 ]

0 голосов
/ 11 июля 2011

Вы также можете сделать свой выбор следующим образом:

        List<RESTAURANT> result = (from RESTAURANT in db.RESTAURANTs.Include("CITY").Include("CUISINE")
                                   where RESTAURANT.CUISINE_ID == cuisineID
                                   select RESTAURANT).ToList();
0 голосов
/ 12 июля 2011

Чего вы пытаетесь достичь здесь? Если вам просто нужно получить доступ к Cuisine с каждого Restuarant, вы сможете выполнить итерацию по List<Restuarant>, например, так ...

List<Restuarant> restuarants = GetList(); // Get the list however you like.
foreach(var r in restuarants)
{
     // Now you can access Cuisine
     var cuisine = r.Cuisine;
}

Вы также можете получить список Cuisine, как это ...

var cuisines = restuarants.Where(c => c.CuisineName == "chips").ToList();

Или что-то похожее.

0 голосов
/ 11 июля 2011

Я сомневаюсь, что ваш запрос на самом деле действительно возвращает город - вы в настоящее время выбираете только ресторан в своем запросе, вместо этого вы можете проецировать на специальный тип, который имеет необходимую информацию:

class RestaurantByCuisine
{
  public string RestaurantName {get;set;}
  public string CityName {get;set;}
  public string CuisineName {get;set;}
}

public List<RestaurantByCuisine> getRestaurants(string cuisineName)
{
    var cuisineID = db.CUISINEs.First(s => s.CUISINE_NAME == cuisineName).CUISINE_ID;

    List<RestaurantByCuisine> result = (from RESTAURANT in db.RESTAURANTs
                                join CITY in db.CITies on RESTAURANT.CITY_ID equals CITY.CITY_ID
                                join CUISINE in db.CUISINEs on RESTAURANT.CUISINE_ID equals CUISINE.CUISINE_ID
                                where RESTAURANT.CUISINE_ID == cuisineID
                                select new RestaurantByCuisine() 
                                { 
                                    RestaurantName = RESTAURANT.Name,
                                    CityName = CITY.Name,
                                    CuisineName = CUISINE.Name
                              ).ToList();

    return result;
}

Предполагается, что у ваших сущностей есть свойство Name, в противном случае вы должны указать правильное имя свойства.

Обратите внимание, что у вашей сущности Restaurant уже есть свойства CITY_ID, CUISINE_ID, поэтому если это внешний ключ для соответствующих таблиц, у вас также должны быть свойства CITY и CUISINE.Они будут заполнены, если вы используете запрос Include() для этих свойств, тогда запрос будет выглядеть следующим образом:

List<RESTAURANT> result = (from RESTAURANT in db.RESTAURANTs.Include(x => x.CITY).Include(x => x.CUISINE)
                            where RESTAURANT.CUISINE_ID == cuisineID
                            select RESTAURANT
                            ).ToList();

Редактировать:

Похожевы используете Linq to Sql, в этом случае вы можете указать параметры загрузки непосредственно в контексте данных:

DL.FVRGDataContext db = new FVRGDataContext();
var dlo = new DataLoadOptions();
dlo.LoadWith<RESTAURANT>(r => r.CITY);
dlo.LoadWith<RESTAURANT>(r => r.CUISINE);
db.LoadOptions = dlo;

Тогда должно работать следующее:

List<RESTAURANT> result = (from RESTAURANT in db.RESTAURANTs
                           where RESTAURANT.CUISINE_ID == cuisineID
                           select RESTAURANT
                           ).ToList();
...