2015-02-27 15 views
5

Ngữ cảnh khung thực thể đang tạo truy vấn cho tôi.Tôi có thể ghi đè trình tạo truy vấn khung Entity Framework không?

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()); 

này kết quả đầu ra chuỗi sau:

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

bảng của tôi là bao gồm cả cột không gian tên là hình học. Entity Framework không chứa các hàm hình học. Ví dụ đây là một chức năng hình học:

SELECT ST_AREA(geom) FROM Cities WHERE CityID = 3 

Vì vậy, tôi không thể sử dụng phương pháp mở rộng bối cảnh như thế này:

context.Cities.Where(....) 

là có thể, hoặc là có bất kỳ phương pháp khuôn khổ tổ chức để ghi đè lên các chức năng hình học.

+0

Tôi không quen với việc thực hiện điều này bản thân mình nhưng tôi tin rằng bạn nên xem xét việc tạo nhà cung cấp LINQ của riêng bạn: https://msdn.microsoft.com/en-us/library/vstudio/bb546158%28v= vs.110% 29.aspx –

+0

Bạn đang sử dụng phiên bản EF nào? EF hỗ trợ các đối tượng không gian, xem ví dụ http://weblog.west-wind.com/posts/2012/Jun/21/Basic-Spatial-Data-with-SQL-Server-and-Entity-Framework-50 – ken2k

Trả lời

1

Bạn không cần ghi đè bất cứ điều gì. Đặt cược của bạn tốt nhất là chỉ cần thực hiện một truy vấn SQL đơn giản thông qua Entity Framework và nó trả về các đối tượng dân cư của bạn.

// 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, ...); 

Nó không phải là "sạch" như sử dụng LINQ, nhưng tôi muốn tưởng tượng hậu cần để thực hiện một LINQ to Entities giải pháp đóng gói thành EF là lý do tại sao họ đã không thực hiện nó được nêu ra. Bạn có thể thử làm điều đó, nhưng có một giải pháp dễ dàng hơn nhiều.

1

Bắt đầu từ EF 6.0 (Cơ sở dữ liệu đầu tiên) nên có khả năng sử dụng các hàm sql. Nó được thực hiện thông qua thuộc tính EdmFunction. Xem ví dụ http://blogs.msdn.com/b/efdesign/archive/2008/10/08/edm-and-store-functions-exposed-in-linq.aspx

Trong bài viết blog họ hiển thị ví dụ:

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

nơi EntityFunctions.DiffYears là hàm

Với EF 6.1 tính năng này nên đã được mở rộng đến Mã đầu tiên. Xem ví dụ http://blog.3d-logic.com/2014/04/09/support-for-store-functions-tvfs-and-stored-procs-in-entity-framework-6-1/

Các vấn đề liên quan