2010-06-22 17 views
11

Vorrei creare una query con una croce applicata in una funzione del valore di tabella definita dall'utente in LINQ. Lo SQL sarebbe veramente piuttosto semplice come sotto:Si applica cross LINQ a SQL

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

This alberino fornisce un esempio di una query LINQ che si traduce in SQL generato che contiene diffusa sia una croce ed un'esterna applica ma solo per una domanda secondaria non per una TVF. L'articolo This conferma che LINQ to SQL genererà operatori cross apply e outer apply per "navigazioni di relazioni" ma non sono sicuro di cosa significhi in questo contesto. This post descrive praticamente cosa voglio fare e la risposta dice che l'unico modo per farlo è quello di avvolgere la query SQL in una stored procedure e quindi chiamare lo sp tramite LINQ. Spero che questo non sia vero perché in realtà ho bisogno di un tvf che possa essere usato in questo modo attraverso un'applicazione in più query LINQ quindi "avvolgere in una sp" non funzionerebbe per me. Qualcuno sa di un modo per ottenere qualcosa come la semplice dichiarazione SQL sopra tramite LINQ?

+0

mastio in mente, quella relazione tra linq e SQL non è suriettiva, quindi non tutti i comandi SQL possono essere interpretati tramite linq. – nothrow

risposta

15

ne dite di questo:

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

Sì, funziona davvero, non posso credere che non l'abbia nemmeno provato. Bello grazie. –

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, 
     }); 

il punto chiave è: .Selezionare (c => c.OrderByDescending (cc => cc.dBeginTime) .Prima())

+1

questo codice può generare sintassi OUTER APPLY – adu

+0

È interessante sapere. Mi sono trasferito praticamente su EF in questi giorni, non ho usato LinqToSQL per un paio d'anni. –