2010-06-22 15 views
11

Me gustaría crear una consulta con una aplicación cruzada en una función de valor de tabla definida por el usuario en LINQ. El SQL sería realmente bastante simple de la siguiente manera:Aplicación cruzada de LINQ a SQL

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

This posterior da un ejemplo de una consulta LINQ que se traduce en SQL generado que contiene aplica tanto una cruz y un exterior aplica pero sólo para una consulta sub no para una tvf El artículo This confirma que LINQ to SQL generará operadores de aplicación cruzada y externos para "navegaciones de relación", pero no estoy seguro de lo que eso significa en este contexto. La publicación This describe más o menos lo que quiero hacer y la respuesta dice que la única forma de hacerlo es ajustar la consulta SQL en un procedimiento almacenado y luego llamar a la sp mediante LINQ. Espero que esto no sea así porque realmente necesito un TVF que se pueda usar de esta manera en una aplicación en múltiples consultas LINQ, así que "envolverlo en sp" no funcionaría para mí. ¿Alguien sabe de una forma de obtener algo como la declaración de SQL simple anterior a través de LINQ?

+0

torreón en mente, esa relación entre linq y SQL no es surjective, por lo que no todos los comandos SQL se pueden interpretar a través de linq. – nothrow

Respuesta

15

¿Qué tal esto:

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

Sí, eso funciona totalmente, no puedo creer que ni siquiera lo haya intentado. Agradable, gracias. –

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

el punto clave es: .Elija (c => c.OrderByDescending (cc => cc.dBeginTime) .First())

+1

este código puede generar la sintaxis APLICAR OUTER – adu

+0

Interesante. Me he mudado a EF en estos días, no he usado LinqToSQL durante un par de años. –