2010-01-05 10 views
3

J'ai une requête linq-to-nhibernate assez grande. J'ai maintenant besoin d'ajouter un filtre basé sur une fonction définie par l'utilisateur écrite dans t-sql dans laquelle je dois passer des paramètres. Dans mon cas, je dois passer un code postal que l'utilisateur tape et le passer à la fonction t-sql pour le filtrer à distance de ce zip. Est-ce possible, ou dois-je réécrire ma requête en utilisant l'API ICriteria?Linq To NHibernate Plus sql fonction définie par l'utilisateur

+0

J'ai le même problème. Avez-vous trouvé une solution ou réécrire la requête en utilisant ICriteria api? –

Répondre

3

i avons trouvé une solution:

Notez la requête NHibernate (de NQUERY) qui a 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)); 
     } 
+0

+1 Bonne solution – DanP