2012-03-28 5 views
0

У меня есть главный стол Fruit, и я хотел бы присоединиться к нему в таблицах ApplePrice, PearPrice и BananaPrice.Внутренний соединять тот же столбец таблицы с несколькими таблицами

Фрукты

Id Type Date 
-------------------- 
1 Apple 1/1 
2 Apple 1/3 
3 Banana 1/5 
4 Pear 1/7 

общего знаменателя [Apple/груша/Banana] Цена (Есть много более конкретных полей для каждой таблицы):

Date Price F1 F2 ... 
----------------------- 
1/1  p1 
1/2  p2 
.... 

Чтобы получить цену каждой части Плод, я присоединяюсь к таблице Фрут с каждой ценовой таблицей отдельно, а затем объединяю результаты вместе.

Если таблицы цен не могут быть объединены в один, у вас есть лучший подход к этой проблеме? Например, постройте один запрос Linq, который возвращает всю информацию, а не конкатенацию результатов из нескольких запросов.

Оцените свои идеи.

ответ

0

Необходимо использовать join into, затем DefaultIfEmpty. LINQ эквивалент SQL LEFT JOIN.

from fruit in fruits 
join ap in applePrices 
    on (fruit.Type + fruit.Date.ToShortDateString()) equals ("Apple" + ap.Date.ToShortDateString()) 
    into aps 
from applePrice in aps.DefaultIfEmpty() 

Это даст:

Fruit | Apple Price | Banana Price | Pear Price 
--------+-------------+--------------+------------ 
    Apple | applePrice |   null |  null 
    Apple | applePrice |   null |  null 
Banana |  null | bananaPrice |  null 
    Pear |  null |   null | pearPrice 

Затем выберите допустимые значения fruitPrice на ниже:

applePrice != null 
    ? applePrice.Price 
    : bananaPrice != null 
     ? bananaPrice.Price 
     : pearPrice != null 
      ? pearPrice.Price 
      : 0 // Default value here if all 3 are null 

И использовать LINQ для выбора желаемого поля.
Полный результат ниже, я использовал анонимный класс, чтобы держать мои ценности:

var prices = from fruit in fruits 
      join ap in applePrices 
       on (fruit.Type + fruit.Date.ToShortDateString()) equals ("Apple" + ap.Date.ToShortDateString()) 
       into aps 
      from applePrice in aps.DefaultIfEmpty() 
      join bp in bananaPrices 
       on (fruit.Type + fruit.Date.ToShortDateString()) equals ("Banana" + bp.Date.ToShortDateString()) 
       into bps 
      from bananaPrice in bps.DefaultIfEmpty() 
      join pp in pearPrices 
       on (fruit.Type + fruit.Date.ToShortDateString()) equals ("Pear" + pp.Date.ToShortDateString()) 
       into pps 
      from pearPrice in pps.DefaultIfEmpty() 
      select new 
       { 
        Id = fruit.Id, 
        Type = fruit.Type, 
        Date = fruit.Date, 
        Price = 
        applePrice != null 
         ? applePrice.Price 
         : bananaPrice != null 
          ? bananaPrice.Price 
          : pearPrice != null 
           ? pearPrice.Price 
           : 0 
       }; 
+0

Спасибо за ваш ответ. Тем не менее, я не уверен, что это лучшее решение, хотя, поскольку утверждение, которое присваивает значение Price, будет выглядеть очень уродливым очень скоро. –

0
var prices = from T in bank.students 
         join O in bank.dovres 
         on (T.code) equals 

         (O.codestu) 
         into aps 
         from applePrice in aps.DefaultIfEmpty() 
         join Y in bank.rotbes 
         on (T.code) equals (Y.codestu) 
         into bps 
         from bananaPrice in bps.DefaultIfEmpty() 

         select new 
         { 
          Id = T.code, 
          Type =T.name, 
          Date = T.family, 
          father=T.fathername, 
          T.adi_date, T.faal_date, 
          // = applePrice.sal + " ماه و " + O.mah + " روز", hk = Y.sal + " ماه و " + Y.mah + " روز" 
          hj = applePrice != null 
          ? applePrice.sal + " ماه و " + applePrice.mah + " روز" 
          :"", 
          hj1 = bananaPrice!= null 
          ? bananaPrice.sal + " ماه و " +bananaPrice.mah + " روز" 
          : "", 

         }; 
      dataGridView1.DataSource = prices; 
      dataGridView1.Columns[0].HeaderText = "کد "; 
      dataGridView1.Columns[1].HeaderText = "نام"; 
      dataGridView1.Columns[2].HeaderText = "نام خانوادگی"; 
      dataGridView1.Columns[3].HeaderText = "نام پدر"; 
      dataGridView1.Columns[4].HeaderText = " عضویت عادی"; 
      dataGridView1.Columns[5].HeaderText = "عضویت فعال"; 
      dataGridView1.Columns[6].HeaderText = "کسری بسیج"; 
      dataGridView1.Columns[7].HeaderText = "کسری جبهه"; 

Это лучший код для соединения 3 или более таблиц.

+0

очень хорошо ................. –

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