Chiamata a una funzione definita dall’utente SQL in una query LINQ

Sto facendo fatica a farlo funzionare. Sto cercando di eseguire una ricerca del raggio utilizzando il seguente helper filtro su un IQueryable. Esistono altri filtri che vengono applicati prima dell’applicazione di RadiusSearch. L’ordine non dovrebbe avere molta importanza dal momento che l’objective è di rinviare la query fino a un’operazione ToList ().

public static IQueryable RadiusSearch(this IQueryable communities) { var centerLatitude = 30.421278; var centerLongitude = -97.426261; var radius = 25; return communities.Select(c => new ApiSearchCommunity() { CommunityId = c.CommunityId, City = c.City, //Distance = c.GetArcDistance(centerLatitude, centerLongitude, c.Latitude, c.Longitude, radius) }); } 

Posso in qualche modo scrivere un helper come GetArcDistance sopra il quale a sua volta chiama un UDF su SQL? La query che sto cercando di generare è la seguente

 SELECT comms.community_id, comms.city, comms.distance FROM ( SELECT c.community_id, c.city, dbo.udf_ArcDistance( 30.421278,-97.426261, c.community_latitude, c.community_longitude ) AS distance FROM communities c) AS comms WHERE comms.distance <= 25 ORDER BY comms.distance 

Ok, penso di aver capito la domanda – il succo di ciò è che si desidera essere in grado di chiamare una UDF SQL come parte della query Linq to Entities.

Questo è se si sta utilizzando il database o il modello prima:

Questo articolo spiega come farlo: http://msdn.microsoft.com/en-us/library/dd456847(VS.100).aspx

Per riassumere, è necessario prima modificare il file edmx in un editor xml, nella sezione edmx: StorageModels >> Schema è necessario specificare un mapping per sql udf, ad es.

    

Quindi è necessario creare una funzione statica da qualche parte con l’attributo EdmFunction su di esso, qualcosa di simile a questo:

 public static class ModelDefinedFunctions { [EdmFunction("TestDBModel.Store", "SampleFunction")] public static int SampleFunction(int param) { throw new NotSupportedException("Direct calls are not supported."); } } 

Questo metodo verrà mappato all’UDF al momento della query dal framework di quadro. Il primo argomento attributo è lo spazio dei nomi del negozio: puoi trovarlo nel tuo file xml edmx sull’elemento Schema (cerca Namespace). Il secondo argomento è il nome di udf.

Puoi quindi chiamarlo qualcosa del genere:

 var result = from s in context.UDFTests select new { TestVal = ModelDefinedFunctions.SampleFunction(22) }; 

Spero che questo ti aiuti.

se usi l’approccio Code-First , non puoi chiamare le UDF come vuoi (come da EF6) – ecco la dimostrazione e un’altra . Si è limitati a chiamare UDF come parte della query SQL :

 bool result = FooContext.CreateQuery( "SELECT VALUE FooModel.Store.UserDefinedFunction(@someParameter) FROM {1}", new ObjectParameter("someParameter", someParameter) ).First(); 

che è brutto IMO e sobject a errori.

Inoltre, questa pagina MSDN dice:

Il processo per chiamare una funzione personalizzata richiede tre passaggi di base:

  1. Definire una funzione nel modello concettuale o dichiarare una funzione nel modello di archiviazione .

il che significa essenzialmente che è necessario utilizzare l’approccio Model-First per chiamare le UDF.