LINQ to SQL: лучше между левым соединением и объединением - PullRequest
0 голосов
/ 07 декабря 2011

Я хочу искать рестораны, которые могут иметь ключевое слово в названии или названии своих продуктов.Я использую LINQ to SQL.Код:

Контекст данных:

protected MyDataContext database;

Вариант 1:

var restaurants = database.tblRestaurants.ByName(keyword).Union(database.tblRestaurants.ByFood(keyword));

Подпись ByName метод:

public static IQueryable<tblRestaurant> ByName(this IQueryable<tblRestaurant> restaurants, string name)
{
    var result = from restaurant in restaurants
                 where restaurant.BusinessName.ToUpper().Contains(name.ToUpper())
                 select restaurant;
    return result;
}

Подпись ByFood Метод:

public static IQueryable<tblRestaurant> ByFood(this IQueryable<tblRestaurant> restaurants, string food)
{
    var result = from restaurant in restaurants
                 from product in restaurant.tblProducts
                 where product.Name.ToUpper().Contains(food.ToUpper())
                 select restaurant;
    return result;
}

Работает нормально.Но у меня есть еще один вариант выбора, используя левое соединение. Вариант 2:

    var restaurants = from restaurant in database.tblRestaurants
                      join product in database.tblProducts
                          on restaurant.OId equals product.RestaurantOId into products
                      from p in products.DefaultIfEmpty()
                      where
                          p.Name.ToUpper().Contains(keyword.ToUpper()) |
                          restaurant.BusinessName.ToUpper().Contains(keyword.ToUpper())
                      select restaurant;

Мой вопрос: какой из них использовать?Параметры рассмотрения:

  • Производительность
  • Ремонтопригодность
  • ООП

В итоге, что бы вы сделали, еслиесть оба варианта

1 Ответ

0 голосов
/ 07 декабря 2011

изменить запрос в варианте 2 следующим образом

from restaurant in restaurants
where restaurant..BusinessName.ToUpper().Contains(keyword.ToUpper()) 
|| restaurant.tblProducts.FirstOrDefault(p=>p.Name.ToUpper().Contains(keyword.ToUpper()) ) != null
select restaurant;
...