Пользовательская функция Linq To NHibernate Plus sql

У меня есть довольно большой запрос linq-to-nhibernate. Теперь мне нужно добавить фильтр на основе определяемой пользователем функции, написанной на t-sql, в которую я должен передавать параметры. В моем случае мне нужно передать почтовый индекс, который вводит пользователь, и передать его функции t-sql для фильтрации по расстоянию от этого почтового индекса. Возможно ли это, или мне нужно переписать мой запрос, используя API ICriteria?


person fregas    schedule 05.01.2010    source источник
comment
У меня та же проблема. Вы придумали решение или переписали запрос, используя API ICriteria?   -  person Craig Bart    schedule 15.02.2010


Ответы (1)


я нашел решение:

Обратите внимание на запрос NHibernate (nquery), который имеет RegisterCustomAction:

private void CallZipSqlFunction(ListingQuerySpec spec, IQueryable<Listing> query)
        {

            var nQuery = query as NHibernate.Linq.Query<Listing>;

            //todo: find some way to paramaterize this or use linq-to-nh and not criteria to call the function
            // so i don thave to check for escape chars in zipcode
            if (spec.ZipCode.Contains("'"))
                throw new SecurityException("invalid character");

            //yuck!
            var functionString = "dbo.GetDistanceForListing('" + spec.ZipCode + "',{alias}.ID) as Distance";
            //create a projection representing the function call
            var distance = Projections.SqlProjection(functionString, new[] { "Distance" }, new IType[] { NHibernateUtil.String });

            //create a filter based on the projection
            var filter = Expression.Le(distance, spec.ZipCodeRadius.Value);

            //add the distance projection as order by
            nQuery.QueryOptions.RegisterCustomAction(x => x.AddOrder(Order.Asc(distance)));

            //add teh distance filter
            nQuery.QueryOptions.RegisterCustomAction(x => x.Add(filter));
        }
person fregas    schedule 18.02.2010