Pra*_*een 13 c# sql linq linq-to-entities entity-framework
我很难让这个工作.我正在尝试使用IQueryable上的以下Filter助手进行半径搜索.在应用RadiusSearch之前,还有一组其他过滤器已应用.顺序不应该真正重要,因为目标是将查询延迟到ToList()操作.
public static IQueryable<ApiSearchCommunity> RadiusSearch(this IQueryable<ApiSearchCommunity> communities)
{
var centerLatitude = 30.421278;
var centerLongitude = -97.426261;
var radius = 25;
return communities.Select(c => new ApiSearchCommunity()
{
CommunityId = c.CommunityId,
City = c.City,
//Distance = c.GetArcDistance(centerLatitude, centerLongitude, c.Latitude, c.Longitude, radius)
});
}
Run Code Online (Sandbox Code Playgroud)
我可以以某种方式编写一个像GetArcDistance这样的帮助程序,然后在SQL上调用UDF吗?我想要生成的查询如下
SELECT
comms.community_id,
comms.city,
comms.distance
FROM (
SELECT
c.community_id,
c.city,
dbo.udf_ArcDistance(
30.421278,-97.426261,
c.community_latitude,
c.community_longitude
) AS distance
FROM communities c) AS comms
WHERE comms.distance <= 25
ORDER BY comms.distance
Run Code Online (Sandbox Code Playgroud)
Mat*_*ton 24
好吧,我想我理解了这个问题 - 它的要点是你希望能够将SQL UDF作为Linq to Entities查询的一部分来调用.
这是您首先使用数据库或模型:
本文介绍了如何执行此操作:http://msdn.microsoft.com/en-us/library/dd456847(VS.100).aspx
总而言之,首先需要在xml编辑器中编辑edmx文件,在edmx:StorageModels >> Schema部分中,您需要指定到sql udf的映射,例如
<Function Name="SampleFunction" ReturnType="int" Schema="dbo">
<Parameter Name="Param" Mode="In" Type="int" />
</Function>
Run Code Online (Sandbox Code Playgroud)
然后你需要在其上创建一个带有EdmFunction属性的静态函数,如下所示:
public static class ModelDefinedFunctions
{
[EdmFunction("TestDBModel.Store", "SampleFunction")]
public static int SampleFunction(int param)
{
throw new NotSupportedException("Direct calls are not supported.");
}
}
Run Code Online (Sandbox Code Playgroud)
此方法将在实体框架的查询时映射到UDF.第一个属性参数是商店命名空间 - 您可以在Schema元素的edmx xml文件中找到它(查找Namespace).第二个参数是udf的名称.
然后你可以这样称呼它:
var result = from s in context.UDFTests
select new
{
TestVal = ModelDefinedFunctions.SampleFunction(22)
};
Run Code Online (Sandbox Code Playgroud)
希望这可以帮助.
avs*_*099 15
如果你使用Code-First方法,那么你不能按你的意愿调用UDF(从EF6开始) - 这是证明,另一个.您只能将UDF作为SQL查询的一部分来调用:
bool result = FooContext.CreateQuery<bool>(
"SELECT VALUE FooModel.Store.UserDefinedFunction(@someParameter) FROM {1}",
new ObjectParameter("someParameter", someParameter)
).First();
Run Code Online (Sandbox Code Playgroud)
这是丑陋的IMO,容易出错.
此外 - 这个MSDN页面说:
调用自定义函数的过程需要三个基本步骤:
- 在概念模型中定义函数或在存储模型中声明函数.
这实际上意味着您需要使用Model-First方法来调用UDF.
| 归档时间: |
|
| 查看次数: |
18854 次 |
| 最近记录: |