2010-06-22 12 views
11

Chciałbym utworzyć zapytanie z krzyżem zastosować do funkcji wartości zdefiniowanej przez użytkownika w LINQ. SQL byłoby naprawdę dość proste, jak poniżej:LINQ do SQL stosuje się krzyżykiem

SELECT * 
FROM MyTable mt 
CROSS APPLY MyTVF(mt.id) 

This postu podaje przykład kwerendy LINQ, które powoduje generowanego SQL, która zawiera zarówno krzyż zastosowanie i zewnętrzną stosuje się jednak tylko do kwerendy sub nie dla tvf. This Artykuł potwierdza, że ​​LINQ do SQL będzie generować cross apply i zewnętrznych operatorów apply dla "Nawigacja relacji", ale nie jestem pewien co to oznacza w tym kontekście. This post opisuje dokładnie to, co chcę zrobić, a odpowiedź mówi, że jedynym sposobem, aby to zrobić, jest zawarcie zapytania SQL w procedurze przechowywanej, a następnie wywołanie sp za pomocą LINQ. Mam nadzieję, że nie jest to prawdą, ponieważ tak naprawdę potrzebuję tvf, który może być używany w ten sposób w całej aplikacji w wielu zapytaniach LINQ, więc "zawiń to w sp" nie będzie działało dla mnie. Czy ktoś wie o sposobie, aby uzyskać coś podobnego prostej instrukcji SQL powyżej za pośrednictwem LINQ?

+0

keep biorąc pod uwagę, że relacja między linq i SQL nie jest sursetywna, więc nie każde polecenie SQL może być interpretowane przez linq. – nothrow

Odpowiedz

15

Jak o tym:

from mt in db.MyTable 
from mf in db.MyTVF (mt.id) 
select new { mt.Blah, mf.Blah } 
+0

Tak, to działa całkowicie, nie mogę uwierzyć, że nawet tego nie spróbowałem. Miło, dzięki. –

0
var query = ActivityRepository.Where(p => p.iAction > -1 && userIds.Contains(p.iSellerId)).GroupBy(c => c.iSellerId).Select(c => c.OrderByDescending(cc => cc.dBeginTime).First()).Select(a => new ActivityInfo 
     { 
      ActivityId = a.iActivityId, 
      StartTime = a.dBeginTime, 
      SellerId = a.iSellerId, 
      EndTime = a.dEndTime, 
      ActivityName = a.sName, 
     }); 

KeyPoint jest: .Wybrać (c => c.OrderByDescending (cc => cc.dBeginTime) .First())

+1

ten kod może generować składnię ZEWNĘTRZNĄ APLIKACJĘ – adu

+0

Interesujące wiedzieć. W dzisiejszych czasach bardzo się przeniosłem na EF, od kilku lat nie używam LinqToSQL. –