2010-06-22 6 views
11

Je souhaite créer une requête avec une application croisée dans une fonction de valeur de table définie par l'utilisateur dans LINQ. Le SQL serait vraiment assez simple comme ci-dessous:Application LINQ to SQL

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

This après donne un exemple d'une requête LINQ qui se traduit par SQL généré qui contient à la fois une croix applique et une extérieure appliquer, mais seulement pour une sous requête non pour une tvf. L'article This confirme que LINQ to SQL générera des opérateurs d'application croisée et externe pour les "navigations de relations", mais je ne suis pas sûr de ce que cela signifie dans ce contexte. This post décrit à peu près ce que je veux faire et la réponse dit que la seule façon de le faire est d'encapsuler la requête SQL dans une procédure stockée, puis d'appeler le sp via LINQ. J'espère que ce n'est pas vrai parce que j'ai vraiment besoin d'un tvf qui peut être utilisé de cette manière dans une application dans plusieurs requêtes LINQ, donc "envelopper dans un sp" ne fonctionnerait pas pour moi. Est-ce que quelqu'un connaît un moyen d'obtenir quelque chose comme la simple instruction SQL ci-dessus via LINQ?

+0

donjon à l'esprit, cette relation entre linq et SQL n'est pas surjective, donc toutes les commandes SQL ne peuvent pas être interprétées via linq. – nothrow

Répondre

15

Que diriez-vous ceci:

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

Ouais ça marche totalement, je ne peux pas croire que je n'ai même pas essayé ça. Sympa un merci. –

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

est le point clé: .Choisir (c => c.OrderByDescending (cc => cc.dBeginTime) .Premier())

+1

ce code peut générer une syntaxe OUTER APPLY – adu

+0

Intéressant à savoir. Je suis passé à EF ces jours-ci, je n'ai pas utilisé LinqToSQL depuis quelques années. –