Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net 如何通过Fluent Nhibernate调用数据库存储函数并获取IQueryable<;T>;因此_.net_Linq_Fluent Nhibernate - Fatal编程技术网

.net 如何通过Fluent Nhibernate调用数据库存储函数并获取IQueryable<;T>;因此

.net 如何通过Fluent Nhibernate调用数据库存储函数并获取IQueryable<;T>;因此,.net,linq,fluent-nhibernate,.net,Linq,Fluent Nhibernate,我已为计算的最近位置存储了数据库功能: CREATE FUNCTION LoadNearBusinesses ( @latitude DECIMAL(25, 10), @longtitude DECIMAL(25, 10), @areaRadius DECIMAL(25, 10) ) RETURNS TABLE AS return SELECT DISTINCT [Business].* FROM [Busi

我已为计算的最近位置存储了数据库功能:

CREATE FUNCTION LoadNearBusinesses
    (
        @latitude DECIMAL(25, 10),
        @longtitude DECIMAL(25, 10),
        @areaRadius DECIMAL(25, 10)
    )
    RETURNS TABLE
    AS
    return SELECT DISTINCT [Business].* FROM [Business] 
     LEFT JOIN [BusinessLocation] ON [BusinessLocation].Business_id = [Business].Id 
     LEFT JOIN [Location] ON [BusinessLocation].Id = [Location].Id
     WHERE 6371 * ACos(COS(@latitude* PI() / 180) * Cos([Location].Latitude * PI() / 180) * Cos(([Location].Longitude- @longtitude)* PI() / 180) + SIN(@latitude* PI() / 180) * Sin([Location].Latitude* PI() / 180)) <= @areaRadius;
创建函数装入器
(
@纬度小数(25,10),
@长十进制(25,10),
@面积半径十进制(25,10)
)
返回表
作为
返回从[Business]中选择不同的[Business].*
在[BusinessLocation].Business\u id=[Business].id上左键加入[BusinessLocation]
在[BusinessLocation]上左键联接[Location]。Id=[Location]。Id

其中6371*ACos(COS(@latitude*PI()/180)*COS([Location].latitude*PI()/180)*COS([Location].Longitude-@longtude)*PI()/180)+SIN(@latitude*PI()/180)*SIN SIN([Location].latitude*PI()/180))这应该会给您一个
IQueryable
,使用与存储过程相同的逻辑。您需要一个对NHibernete.Linq的引用才能使其工作

int latitude = 1;
int longitude = 2;

var q = from business in session.Query<Business>()
        join businessLocation in session.Query<BusinessLocation>()
           on business.Id equals businessLocation.Business_Id into busBusLoc
        from subBusiness in busBusLoc.DefaultIfEmpty()
        join location in session.Query<Location>()
           on businessLocation.Id equals location.Id into busBusLocLoc
        from subBusinessLocationLocation in busBusLocLoc.DefaultIfEmpty()
        where (6371 * Math.Acos(Math.Cos(latitude * Math.PI / 180) 
                    * Math.Cos(l.Latitude * Math.PI / 180) 
                    * Math.Cos((l.Longitude - longtitude) * Math.PI / 180) 
                         + Math.Sin(latitude * Math.PI / 180) 
                         * Math.Sin(location.Latitude * Math.PI / 180)))
                <= areaRadius
        select business;
int纬度=1;
int经度=2;
var q=来自会话中的业务。Query()
在session.Query()中加入businessLocation
在业务上.Id等于businessLocation.business\u Id进入busloc
来自busBusLoc.DefaultIfEmpty()中的子业务
会话中的联接位置。查询()
在businessLocation.Id中等于location.Id到buslocloc
来自busBusLocLoc.DefaultIfEmpty()中的subBusinessLocationLocation
其中(6371*Math.Acos(Math.Cos)(纬度*Math.PI/180)
*Math.Cos(l.Latitude*Math.PI/180)
*Math.Cos((经度-经度)*Math.PI/180)
+Math.Sin(纬度*Math.PI/180)
*Math.Sin(location.lation*Math.PI/180)))

使用@SteveMallory query(我认为这是正确的做法)可以面临的一个问题是,Linq到NHibernate不支持数学三角函数,但它确实支持扩展自身:)

检查这两个链接以解决此问题: 及

谢谢你的回答,但Linq to Nhibernate不支持Math.Acos,Math.Cos Functions谢谢你的回答。但据我所知,使用Fluent Nhibernate处理存储函数没有“传统”的方法
int latitude = 1;
int longitude = 2;

var q = from business in session.Query<Business>()
        join businessLocation in session.Query<BusinessLocation>()
           on business.Id equals businessLocation.Business_Id into busBusLoc
        from subBusiness in busBusLoc.DefaultIfEmpty()
        join location in session.Query<Location>()
           on businessLocation.Id equals location.Id into busBusLocLoc
        from subBusinessLocationLocation in busBusLocLoc.DefaultIfEmpty()
        where (6371 * Math.Acos(Math.Cos(latitude * Math.PI / 180) 
                    * Math.Cos(l.Latitude * Math.PI / 180) 
                    * Math.Cos((l.Longitude - longtitude) * Math.PI / 180) 
                         + Math.Sin(latitude * Math.PI / 180) 
                         * Math.Sin(location.Latitude * Math.PI / 180)))
                <= areaRadius
        select business;