2015-09-18 3 views
0

Я ищу предложения о том, как отфильтровать запрос LINQ ниже. Вы можете видеть, что в нем задействовано 6 таблиц, а выбранная таблица - это b-бронирование. Затем, в зависимости от того, являются ли переданные переменные нулевыми или нет, я добавляю предложения WHERE, но, как я понимаю, если я выбираю из b, тогда я могу только добавить предложение WHERE в b, поэтому, если я хочу добавить WHERE к любой из других связанных таблиц, как я могу это сделать в LINQ?WHERE предложения в многозадачном запросе LINQ

public List<DAL.Booking> GetBookingMain(string _booking, string _project, string _customer, string _location, 
              string _supplierSKU, string _eisSKU, string _assetREF) 
    { 
     List<DAL.Booking> list_item = new List<DAL.Booking>(); 
     var qry = (from b in edc.Bookings 
     join cu in edc.Customers on b.customer_ref equals cu.customer_ref 
     join loc in edc.Locations on cu.customer_ref equals loc.customer_ref 
     join pl in edc.Pallets on i.booking_ref equals pl.booking_id 
     join pp in edc.ProductsToPallets on pl.PalletID equals pp.palletID 
     join pr in edc.Products on pp.productID equals pr.product_id 
     select b); 
     if (_booking != Null) 
     { 
      qry = qry.Where(b => b.booking_ref == _booking); 
     } 
     if (_project != Null) 
     { 
      qry = qry.Where(b => b.project_ref == _project); 
     } 
     if (_customer != Null) 
     { 
      qry = qry.Where(b => b.customer_ref == _customer); 
     } 
     if (_location != Null) 
     { 
      //add WHERE for table loc 
     } 
     if (_supplierSKU != Null) 
     { 
      //add WHERE for table pr 
     } 
     if (_eisSKU != Null) 
     { 
      //add WHERE for table pr 
     } 
     if (_assetREF != Null) 
     { 
      //add WHERE for table pp 
     } 
     list_item = qry.ToList(); 
     return list_item; 
    } 

Благодаря

+0

Вы пробовали, например, 'qry = qry.Where (i => loc.something == value);'? – Jamiec

+0

yep, intellisense только предоставляет поля, доступные в b – DarkW1nter

+0

ах, да теперь я вижу - из-за 'select b' – Jamiec

ответ

2

Вы можете сделать это:

var bQuery = edc.Bookings; 
var quQuery = edc.Customers; 
var locQuery = edc.Locations; 
... 
var prQuery = edc.Products; 

    if (_booking != Null) 
    { 
     bQuery = bQuery.Where(i => i.booking_ref == _booking); 
    } 
    if (_project != Null) 
    { 
     prQuery = prQuery.Where(i => i.project_ref == _project); 
    } 
    ... 
    var list_item = (from b in bQuery 
    join cu in cuQuery on b.customer_ref equals cu.customer_ref 
    join loc in locQuery on cu.customer_ref equals loc.customer_ref 
    ... 
    join pr in prQuery.Products on pp.productID equals pr.product_id 
    select b).ToList(); 

Мы формируем запросы для всех соединяемых таблиц, но не выполняющее. Затем мы добавляем выражения фильтра, затем формируем окончательный запрос, присоединяя все запрошенные ранее формы и материализируя окончательный запрос к списку.

+0

Спасибо, не получится попробовать это до более позднего сегодняшнего дня, так что дадут обновление, затем – DarkW1nter

Смежные вопросы