2015-04-08 15 views
15

Tôi đang cố gắng một cái gì đó tương tự như sau:Entity Framework 6 Mã Đầu tiên Tuỳ chỉnh Chức năng

How to use scalar-valued function with linq to entity?

Tuy nhiên tôi không sử dụng EDMX, nhưng thay vì chỉ DbContext và mã đầu tiên.

tôi đã đi qua này:

https://codefirstfunctions.codeplex.com/

Nhưng việc sử dụng không phù hợp. Những gì tôi đang cố gắng đạt được là có thể thực hiện điều này:

var locations = context.Locations.Where(e => Functions.LatLongDistanceCalc(e.Lat, e.Long, lat, long) >= 10) 

Trường hợp nó sẽ gọi hàm vô hướng (LatLongDistanceCalc) trên SQL Server.

Có cách nào để thực hiện việc này mà không cần sử dụng EDMX không? Tôi biết rằng bạn có thể xây dựng một truy vấn thủ công nhưng điều này sẽ không được ưa thích bởi vì tôi muốn mang lại các thực thể với proxy tải lười biếng, vv cũng như xây dựng một truy vấn phức tạp hơn.

Trả lời

24

Bạn sẽ có thể sử dụng một hàm SQL vô hướng trong Where tiêu chí của bạn với CodeFirstStoreFunctions

Giả sử bạn muốn ánh xạ chức năng SQL [dbo] [LatLongDistanceCalc], và theo the test suite:.

public class MyDataContext: DbContext 
{ 
    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     //... 

     modelBuilder.Conventions.Add(new FunctionsConvention("dbo", this.GetType())); 
    } 

    // "CodeFirstDatabaseSchema" is a convention mandatory schema name 
    // "LatLongDistanceCalc" is the name of your function 

    [DbFunction("CodeFirstDatabaseSchema", "LatLongDistanceCalc")] 
    public static int LatLongDistanceCalc(int fromLat, int fromLong, 
                 int toLat, int toLong) 
    { 
     // no need to provide an implementation 
     throw new NotSupportedException(); 
    } 
} 

cách sử dụng sau đó sẽ là:

context.Locations 
     .Where(e => MyDataContext.LatLongDistanceCalc(e.Lat, e.Long, lat, long) >= 10) 
+0

Tôi không chắc chắn làm thế nào tôi đã không nhận được điều này trước đó nhưng điều này hoạt động 100%. Cảm ơn bạn! – AndrewC

+2

Tôi muốn thêm rằng điều này hoạt động nếu bạn đang ở trong lựa chọn/ngữ cảnh. Nếu bạn ở bên ngoài - nó sẽ không hoạt động. –

+0

Tôi đã cố gắng sử dụng nó với chức năng Max tôi đã tạo, không có tham số đầu vào và cho đến nay không thành công. Tôi luôn nhận được NotSupportedException. – yopez83

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