2010-06-22 16 views
11

Ich möchte eine Abfrage mit einem Kreuz in einer benutzerdefinierten Tabelle Wertfunktion in LINQ anwenden. Die SQL wäre wirklich ziemlich einfach, wie unten:LINQ to SQL Kreuz gelten

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

This Post ein Beispiel einer LINQ-Abfrage gibt, die in den generierten SQL-Ergebnisse, die sowohl ein Quer enthält anwenden und eine äußere gelten aber nur für eine Sub-Abfrage nicht für eine TVF. This Artikel bestätigt, dass LINQ to SQL Kreuz anwenden und äußeren apply-Operatoren für "Beziehungsnavigationen" generieren, aber ich bin mir nicht sicher, was das in diesem Zusammenhang bedeutet. This Post beschreibt ziemlich viel, was ich tun möchte und die Antwort sagt, die einzige Möglichkeit, dies zu tun ist, die SQL-Abfrage in eine gespeicherte Prozedur zu wickeln und dann die SP über LINQ aufrufen. Ich hoffe, dass dies nicht wahr ist, weil ich tatsächlich ein tvf benötige, das auf diese Weise in einer Anwendung in mehreren LINQ-Abfragen verwendet werden kann, so dass "es in eine SP umwandelt" für mich nicht funktionieren würde. Kennt jemand einen Weg, um etwas wie die einfache SQL-Anweisung über LINQ zu bekommen?

+0

keep Im Hinblick darauf ist diese Beziehung zwischen linq und SQL nicht surjektiv, so dass nicht jeder SQL-Befehl über linq interpretiert werden kann. – nothrow

Antwort

15

Wie wäre es damit:

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

Ja, das funktioniert völlig, ich kann nicht glauben, dass ich es nicht einmal versucht habe. Netter Dank. –

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

die keypoint ist: .Select (c => c.OrderByDescending (cc => cc.dBeginTime) .First())

+1

Dieser Code kann OUTER APPLY Syntax generieren – adu

+0

Interessant zu wissen. Ich bin in diesen Tagen ziemlich zu EF gewechselt und habe LinqToSQL seit einigen Jahren nicht mehr benutzt. –