2015-02-27 9 views
5

Entity Framework-Kontext generiert Abfragen für mich.Kann ich den Entity Framework-Abfragegenerator überschreiben?

var query = from c in context.Cities where c.CityID == 3 select c; 
var objectQuery=query as System.Data.Objects.ObjectQuery; 
Console.WriteLine(objectQuery.ToTraceString()); 

Dieser gibt die folgende Zeichenfolge:

SELECT 
[Extent1].[CityID] AS [CityID], 
[Extent1].[geom] AS [geom], 
[Extent1].[Name] AS [Name], 
FROM [dbo].[Cities] AS [Extent1] 
WHERE 3 = [Extent1].[CityID] 

Meine Tabelle räumliche Spalte namens Geometrie einschließlich. Entity Framework enthält keine Geometriefunktionen. Zum Beispiel ist dies eine Geometriefunktion:

SELECT ST_AREA(geom) FROM Cities WHERE CityID = 3 

So konnte ich nicht Kontext-Extension-Methode wie folgt verwenden:

context.Cities.Where(....) 

ist möglich, oder ist es eine Methode, Entity Framework geometrische Funktionen außer Kraft zu setzen.

+0

Ich bin nicht vertraut mit der Umsetzung dieser selbst, aber ich glaube, Sie sollten in die Erstellung Ihrer eigenen LINQ-Anbieter suchen: https://msdn.microsoft.com/en-us/library/vstudio/bb546158%28v= vs.110% 29.aspx –

+0

Welche EF-Version verwenden Sie? EF unterstützt räumliche Objekte, siehe zum Beispiel http://weblog.west-wind.com/posts/2012/Jun/21/Basic-Spatial-Data-with-SQL-Server-and-Entity-Framework-50 – ken2k

Antwort

1

Sie müssen nichts überschreiben. Am besten führen Sie eine einfache SQL-Abfrage über Entity Framework aus und lassen Sie Ihre befüllten Objekte zurückgeben.

// Add in whatever spatial stuff you need here. 
var sql = "SELECT * FROM Cities WHERE CityId = {0} AND ..."; 

// Add whatever other parameters you need to the rest of the parameters. 
var cities = context.Database.SqlQuery<City>(sql, cityId, ...); 

Es ist nicht so „sauber“ wie LINQ, aber ich würde die Logistik vorstellen, eine LINQ to Entities Lösung in EF verpackte Umsetzung ist der Grund, warum sie es noch nicht getan haben. Sie können versuchen, es zu tun, aber es gibt eine viel einfachere Lösung.

1

Ab EF 6.0 (Database First) sollte die Möglichkeit bestehen, sql-Funktionen zu verwenden. Es ist durch das EdmFunction Attribut erfolgt. Siehe zum Beispiel http://blogs.msdn.com/b/efdesign/archive/2008/10/08/edm-and-store-functions-exposed-in-linq.aspx

Im Blog-Artikel sie zum Beispiel zeigen:

var query = 
    from p in context.Products 
    where EntityFunctions.DiffYears(DateTime.Today, p.CreationDate) < 5 
    select p; 

wo EntityFunctions.DiffYears die Funktion ist

Mit EF 6.1 dieser Funktion-Code Ersten verlängert werden soll. Siehe zum Beispiel http://blog.3d-logic.com/2014/04/09/support-for-store-functions-tvfs-and-stored-procs-in-entity-framework-6-1/

Verwandte Themen