2016-02-09 2 views
1

У меня есть запрос 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. Есть какой-либо способ сделать это?

+0

Почему может» t вы добавляете другое соединение? –

ответ

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(); 
+0

Я пробовал это. Но получение этой ошибки: «Невозможно неявно преобразовать тип» System.Linq.IQueryable 'to' string'' –

+0

@ LimnaD'silva: Обновлено, однако, это просто пример. Вы получаете эту ошибку, потому что тип 'LOC_NAME' отличается от' LOCATION_AD'. Проверьте, является ли тип получения данных из базы данных «string», если да, вам нужно проверить тип свойства «LOCATION_AD» класса ASNPutawayRep. – SiD

+0

Оба объявлены как строка. –

0

Вы можете использовать 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(); 
+0

Когда я попробовал это, я получил ошибку '' System.Linq.IQueryable 'не содержит определения для FirstorDefault и не использует метод расширения FirstorDefault, принимающий первый аргумент типа' System.Linq.IQueryable ', можно найти (вам не хватает директивы using или ссылки на сборку?) '' –

+0

у вас есть Sytem.Linq, используя оператор в файле, где этот код находится правильно? – Viru

+0

Странно ... Это должно сработать ... Я думаю, что, когда вы используете EF, весь запрос передается как выражение, а когда QueryProvider пытается выполнить выражение, это терпит неудачу ... Я удалил AsQueryable() из ответа. – Viru

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