Получение значения столбца из другого подзапроса

У меня есть запрос LINQ. Но мне нужно получить значение двух столбцов из другого подзапроса. Это мой запрос Linq:

)from t in db.PUTAWAYs
join t0 in db.ASN_ITEM on t.AWB_NO equals t0.AWB_NO
join t1 in db.ASN_MASTER on t0.AWB_NO equals t1.AWB_NO
join t2 in db.ITEM_MASTER on t.ITEM_MASTER.ITEM_CODE equals t2.ITEM_CODE
join t3 in db.ASN_INPUT on t0.AWB_NO equals t3.AWB_NO
where
  t3.ITEM == t2.ITEM_CODE &&
  1 == 1 &&                          
  (fromDate == "" || toDate == "" || (t0.REC_DATE.CompareTo(fromDate) >= 0 && t0.REC_DATE.CompareTo(toDate) <= 0)) &&
  (AWB_NO == "" || (t0.AWB_NO == AWB_NO))
orderby
  t.AWB_NO,
  t0.REC_DATE,
  t0.STYPE,
  t2.PART_NO
select new ASNPutawayRep
{
    AWB_NO = t.AWB_NO,
    REC_DATE = t0.REC_DATE,
    STYPE = t0.STYPE,
    PART_NO = t2.PART_NO,
    //LOCATION_AD = t.LOCATION_AD,
    QNTY = t.QNTY,
    //LOCATION_SD = t.LOCATION_SD,
    REGION_ID = t.REGION_ID
}).Distinct();

Здесь, в выбранной части вышеуказанного запроса, вместо того, чтобы напрямую принимать значение столбца t.LOCATION_AD, мне нужно получить его из SELECT LOC_NAME FROM LOCATION_MASTER WHERE LOC_CODE = t.LOCATION_AD

и вместо t.LOCATION_SD мне нужно получить значение из SELECT LOC_NAME FROM LOCATION_MASTER where LOC_CODE = t.LOCATION_SD

Как я могу написать это в LINQ. Есть какой-либо способ сделать это?


person Limna Dsilva    schedule 09.02.2016    source источник
comment
Почему нельзя добавить еще одно соединение?   -  person lc.    schedule 09.02.2016


Ответы (2)


Вы можете использовать предложение let. Полезно сохранить результат подвыражения, чтобы использовать его в последующих предложениях.

Пример:

(from t in db.PUTAWAYs
 ...
 let locAd = from l in LOCATION_MASTER where LOC_CODE = t.LOCATION_SD select l.LOC_NAME
 where
 ...
 orderby
 ...
 select new ASNPutawayRep
 {
     LOCATION_AD = locAd,
 }).Distinct();

Кроме того, вы можете напрямую написать LINQ без использования предложения let:

(from t in db.PUTAWAYs
 ...
 where
 ...
 orderby
 ...
 select new ASNPutawayRep
 {
     LOCATION_AD = from l in LOCATION_MASTER where LOC_CODE = t.LOCATION_SD select l.LOC_NAME
 }).Distinct();
person SiD    schedule 09.02.2016
comment
Я пробовал это. Но получаю эту ошибку: Cannot implicitly convert type 'System.Linq.IQueryable<string>' to 'string' - person Limna Dsilva; 09.02.2016
comment
@LimnaD'silva: обновлено, однако это всего лишь пример. Вы получаете эту ошибку, потому что тип LOC_NAME отличается от LOCATION_AD. Проверьте, является ли тип выборки значения из базы данных string, если да, вам нужно проверить тип свойства LOCATION_AD класса ASNPutawayRep. - person SiD; 09.02.2016
comment
Оба объявлены как строки. - person Limna Dsilva; 10.02.2016

Вы можете использовать AsQueryable для достижения этого

from t in db.PUTAWAYs
join t0 in db.ASN_ITEM on t.AWB_NO equals t0.AWB_NO
join t1 in db.ASN_MASTER on t0.AWB_NO equals t1.AWB_NO
join t2 in db.ITEM_MASTER on t.ITEM_MASTER.ITEM_CODE equals t2.ITEM_CODE
join t3 in db.ASN_INPUT on t0.AWB_NO equals t3.AWB_NO
where
  t3.ITEM == t2.ITEM_CODE &&
  1 == 1 &&                          
  (fromDate == "" || toDate == "" || (t0.REC_DATE.CompareTo(fromDate) >= 0 && t0.REC_DATE.CompareTo(toDate) <= 0)) &&
  (AWB_NO == "" || (t0.AWB_NO == AWB_NO))
orderby
  t.AWB_NO,
  t0.REC_DATE,
  t0.STYPE,
  t2.PART_NO
select new ASNPutawayRep
{
    AWB_NO = t.AWB_NO,
    REC_DATE = t0.REC_DATE,
    STYPE = t0.STYPE,
    PART_NO = t2.PART_NO,
    LOCATION_AD = (from l in db.LOCATION_MASTER 
                     where l.LOC_CODE = t.LOCATION_AD
                     select LocName)ToList().FirstorDefault(),
    QNTY = t.QNTY,
    LOCATION_SD = (from l in db.LOCATION_MASTER 
                     where l.LOC_CODE = t.LOCATION_SD
                     select LocName).ToList().FirstorDefault(),
    REGION_ID = t.REGION_ID
}).Distinct();
person Viru    schedule 09.02.2016
comment
Когда я попробовал это, я получил ошибку 'System.Linq.IQueryable<string>' does not contain a definition for FirstorDefault and no extension method 'FirstorDefault' accepting a first argument of type 'System.Linq.IQueryable<string>' could be found (are you missing a using directive or an assembly reference?)' - person Limna Dsilva; 09.02.2016
comment
у вас есть оператор System.Linq с использованием в файле, где этот код находится правильно ?? - person Viru; 09.02.2016
comment
Странно... Это должно работать... Я думаю, что, поскольку вы используете EF, весь запрос передается как выражение, и когда QueryProvider пытается выполнить выражение, оно терпит неудачу... Я удалил AsQueryable() из ответа. Пожалуйста, попробуйте еще раз - person Viru; 09.02.2016
comment
Вы пробовали другой ответ, данный SID? - person Viru; 10.02.2016
comment
Да.. Это я тоже пробовал. Но такая же ошибка существует. - person Limna Dsilva; 10.02.2016
comment
Я проверил. Но это говорит 'System.Linq.IQueryable<string>' does not contain a definition for FirstorDefault.... Я думаю, что в этом случае это невозможно (чтобы получить значение столбца с помощью подзапроса): ( - person Limna Dsilva; 10.02.2016