我在SQL Server中有一个表,其中包含所有商店信息。
列是:
storeId, locationLongitude, locationLatitude
和一个sql函数getDistance
,它带有参数(Customer Longitude,Customer Latitude,store Longitude,store latitude)
我当前的SQL查询是:
SELECT TOP 5
dbo.[getDistance] (473.510432, -122.154381, locLatitude, locLongitude, 'Miles') AS distance,
loclatitude, loclongitude, storeId ,
FROM
storelocation WITH(NOLOCK)
ORDER BY
distance;
我目前正在缓存所有商店信息,然后运行linq过滤掉数据有没有办法在linq中调用getDistance
?
答案 0 :(得分:1)
您可以使用this package扩展Linq-to-Entities(EF 6.1),以便您的上下文支持表值函数。
首先,您需要为您的上下文添加一个方法,就像这样; (为您的上下文类型名称交换名称“MyContext”)
[DbFunction("MyContext", "getDistance")]
[DbFunctionDetailsAttribute(ResultColumnName = "locationId", DatabaseSchema = "dbo")]
public IQueryable<StoreInfo> getDistance(int locLatitude, int locLongitude)
{
return F2<StoreInfo, int, int>("getDistance", "locLatitude", locLatitude, "locLongitude", locLongitude);
}
这会调用您还需要添加的实用程序功能;
private IQueryable<TResult> F2<TResult, TParam1, TParam2>(string functionName, string parameterName1,
TParam1 parameterValue1, string parameterName2,
TParam2 parameterValue2)
{
var queryString = string.Format("[{0}].[{1}](@{2}, @{3})", GetType().Name, functionName, parameterName1, parameterName2);
var parameter1 = new ObjectParameter(parameterName1, parameterValue1);
var parameter2 = new ObjectParameter(parameterName2, parameterValue2);
var query = this.ObjectContext.CreateQuery<TResult>(queryString, parameter1, parameter2);
return query;
}
最后,在OnModelCreating中,注册函数返回的类型;
modelBuilder.ComplexType<StoreInfo>();
现在您的上下文具有IQueryable,您可以在Linq-to-entities中使用它。