在 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);
我正在使用 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);