在 entity framework 中使用数据库函数

Using a database function with entity framework

我正在使用 entity framework 开发一个新网站。

使用另一个站点的代码,即 linq to sql,我有一个数据库函数来计算从一组经纬度到另一组的距离。和函数 returns 带距离的小数。

我已经在 ApplicationDbContext class 中添加到我的 identitymodel.cs:

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
    public ApplicationDbContext()
        : base("DefaultConnection", throwIfV1Schema: false)
    {
    }

    public static ApplicationDbContext Create()
    {
        return new ApplicationDbContext();
    }
 public ObjectResult<int> getDistance(string lat1, string lon1, string lat2, string lon2)
    {
        var params1 = new[] {
            new ObjectParameter("lat1", lat1),
            new ObjectParameter("lon1", lon1),
            new ObjectParameter("lat2", lat2),
            new ObjectParameter("lon2", lon2)
        };                

        return ((IObjectContextAdapter)this).ObjectContext.ExecuteFunction<int>("LatLonRadiusDistance", params1);
    }
}

这是我的查询:

var datap = (from p in db.table
                     where db.LatLonRadiusDistance(data.lat, data.lon, p.platitude, p.plongitude) <= 10
                     select new latlon
                     {
                         lat = p.property_lat,
                         lon = p.property_lon,
                         address = p.property_address,
                         id = p.property_id,
                         count = ecount
                     }).Take(500);

但是现在我收到一个错误:

The FunctionImport 'LatLonRadiusDistanceVarchar' could not be found in the container 'ApplicationDbContext'.

我做错了什么?

如果您使用的是 EF 4.1 及更高版本,请在 Context.cs 文件中将 "ObjectParameter" 更改为 "SqlParameter" 并将 "ExecuteFunction" 更改为 "ExecuteStoreQuery"。

"ExecuteStoreQuery" 方法还要求您在存储过程的前面添加参数名称。查找以下示例。

    var param1Parameter = param1 != null ?
    new SqlParameter("param1", param1) :
    new SqlParameter("param1", typeof(string));

    var param2Parameter = param2 != null ?
    new SqlParameter("param2", param2) :
    new SqlParameter("param2", typeof(int));

    return ((IObjectContextAdapter)this).ObjectContext.ExecuteStoreQuery<sp_TestSproc_Result>("sp_TestSproc @param1, @param2", param1Parameter, param2Parameter);