Can you transform ExampleMethod and ExampleType in something concrete.... for example Distance and IGeography or something like that ?
Have you the set of extensions methods for NHSP ? On Fri, Aug 20, 2010 at 7:51 AM, David Pfeffer <[email protected]> wrote: > That is roughly what I have. However, when you call visitor.Visit on the > argument in question there is the exception because of it not knowing which > IType to map to. > > The ExampleMethod and ExampleType I refer to was from my example in an > earlier email... > > > public static bool ExampleMethod(this int x, ExampleType y) { ... } > > Even if I map this method using a generator with buildHql method, I still > don't have a way to specify the IType for *ExampleType* from the above > example. > > > On Thu, Aug 19, 2010 at 11:14 PM, Fabio Maulo <[email protected]>wrote: > >> I don't know what "ExampleMethod" and "ExampleType" are but if >> "ExampleType" have some meaning for persistence you can translate it to >> IType as we are doing for any parameter. >> >> David, I know that perhaps it doesn't look easy to implement but this is >> OSS. >> >> btw... backing to the title of this thread... >> NHSP has the registration of some HQLFunction you can map the name of the >> extension with the name of the HQLFunction (using exactly the same name or >> using a dictionary) and then you can use >> >> treeBuilder.MethodCall(theHqlFunctionName, >> visitor.Visit(expression).AsExpression()); >> >> or even more easy you can use LinqExtensionMethodAttribute to mark your >> extension and there specify the HQLFunction's name >> >> On Thu, Aug 19, 2010 at 11:56 PM, David Pfeffer <[email protected]>wrote: >> >>> How would I provide that? As far as I know, you'd have to use the >>> IHqlExpressionVisitor argument to the BuildHql method to "visit" that >>> argument of the extension method. Otherwise any expression passed to that >>> argument would not be evaluated. How would I specify the user type in this >>> instance? >>> >>> >>> On Thu, Aug 19, 2010 at 10:51 PM, Fabio Maulo <[email protected]>wrote: >>> >>>> In the implementation of of your Generator for your extension you can >>>> specify the IType. >>>> In this way you have a real LINQ extension working in RAM as it will >>>> work using NHibernate. >>>> >>>> If you are in a "safe-zone" where you can have the reference to >>>> NHibernate dll, you can use any other query-system provided by NHibernate, >>>> you don't need LINQ. >>>> >>>> >>>> On Thu, Aug 19, 2010 at 11:46 PM, David Pfeffer <[email protected]>wrote: >>>> >>>>> I've seen this blog post but I'm not sure how it applies. I'm aware of >>>>> how you'd implement ExampleMethod but not how you'd specify the user type >>>>> for mapping of ExampleType. >>>>> >>>>> >>>>> On Thu, Aug 19, 2010 at 10:44 PM, Fabio Maulo <[email protected]>wrote: >>>>> >>>>>> >>>>>> http://fabiomaulo.blogspot.com/2010/07/nhibernate-linq-provider-extension.html >>>>>> >>>>>> >>>>>> On Thu, Aug 19, 2010 at 11:41 PM, David Pfeffer >>>>>> <[email protected]>wrote: >>>>>> >>>>>>> That might work for instances of direct comparison, but what of an >>>>>>> extension method where the arguments are different... for example this >>>>>>> theoretical method: >>>>>>> >>>>>>> public static bool ExampleMethod(this int x, ExampleType y) { ... } >>>>>>> >>>>>>> In this example you have a usage but the usage isn't going to help >>>>>>> you guess the mapping type for ExampleType. The only way I can think of >>>>>>> doing that is with the extension method patch. If you have another idea >>>>>>> I'd >>>>>>> be excited to hear it though. Otherwise would that be an acceptable >>>>>>> solution >>>>>>> and should I go ahead with it? >>>>>>> >>>>>>> >>>>>>> On Thu, Aug 19, 2010 at 9:58 PM, Fabio Maulo >>>>>>> <[email protected]>wrote: >>>>>>> >>>>>>>> ExpressionParameterVisitor >>>>>>>> NHibernateUtil.GuessType(expression.Type) >>>>>>>> >>>>>>>> We can't guess the type without the "usage context". >>>>>>>> myClass.MyProperty == something >>>>>>>> >>>>>>>> to really guess/know the type of "something" we have to know the >>>>>>>> mapping of "MyProperty". >>>>>>>> >>>>>>>> We may have an ugly patch-extension method where the user can >>>>>>>> specify the NH's IType but... well... that will be a patch not a >>>>>>>> solution. >>>>>>>> >>>>>>>> On Thu, Aug 19, 2010 at 3:46 PM, David Pfeffer >>>>>>>> <[email protected]>wrote: >>>>>>>> >>>>>>>>> Right, which is exactly what I'm working on right now... >>>>>>>>> >>>>>>>>> What I'm proposed is a fix for the issues relating to the LINQ >>>>>>>>> provider custom types. What do you all think of the solution? >>>>>>>>> >>>>>>>>> >>>>>>>>> On Thu, Aug 19, 2010 at 11:41 AM, Fabio Maulo < >>>>>>>>> [email protected]> wrote: >>>>>>>>> >>>>>>>>>> I think that first we have to fix issues related to Linq-Provider >>>>>>>>>> and custom-types then we have to add some linq-extensions inside >>>>>>>>>> NHibernate-Spatial (as it has HQL extensions). >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> On Thu, Aug 19, 2010 at 11:02 AM, David Pfeffer < >>>>>>>>>> [email protected]> wrote: >>>>>>>>>> >>>>>>>>>>> An example from NH Spatial -- >>>>>>>>>>> >>>>>>>>>>> I have a type... >>>>>>>>>>> >>>>>>>>>>> public class Breadcrumb >>>>>>>>>>> { >>>>>>>>>>> public virtual int Id { get; set; } >>>>>>>>>>> public virtual IGeometry Position { get; set; } >>>>>>>>>>> public virtual string Description { get; set; } >>>>>>>>>>> } >>>>>>>>>>> >>>>>>>>>>> ...and in my code I do the following... >>>>>>>>>>> >>>>>>>>>>> IGeometry center; >>>>>>>>>>> // code here to set the center to a useful point >>>>>>>>>>> var breadcrumbsWithinDistance = >>>>>>>>>>> session.Query<Breadcrumb>().Where(x => x.Position.Distance(center) >>>>>>>>>>> < 500); >>>>>>>>>>> >>>>>>>>>>> Now, how would the LINQ engine know the mapping of *center*? >>>>>>>>>>> Since it isn't a property of a mapped class there's nothing already >>>>>>>>>>> specified here for what user type to use. >>>>>>>>>>> >>>>>>>>>>> I propose that line could be replaced as... >>>>>>>>>>> >>>>>>>>>>> var breadcrumbsWithinDistance = >>>>>>>>>>> session.Query<Breadcrumb>().Where(x => >>>>>>>>>>> x.Position.Distance(center.AsUserType(new >>>>>>>>>>> NHibernate.Type.CustomType(typeof(NHibernate.Spatial.Type.MsSql2008GeographyType), >>>>>>>>>>> null) >>>>>>>>>>> )) < 500); >>>>>>>>>>> >>>>>>>>>>> (or whatever other user type is appropriate for that database >>>>>>>>>>> engine) >>>>>>>>>>> >>>>>>>>>>> What do you think? >>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>>> On Mon, Aug 16, 2010 at 5:16 PM, Fabio Maulo < >>>>>>>>>>> [email protected]> wrote: >>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> El 16/08/2010, a las 12:14, David Pfeffer <[email protected]> >>>>>>>>>>>> escribió: >>>>>>>>>>>> >>>>>>>>>>>> I would attempt to write a fix, but this isn't just a bug. >>>>>>>>>>>> There's a design issue to be resolved here as to how to go about >>>>>>>>>>>> implementing this. >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> I'm not so sure about " a design issue"... >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> One idea I have is to create an extension method, >>>>>>>>>>>> WithUserType(this object obj, IType type) that will be used to >>>>>>>>>>>> inform the >>>>>>>>>>>> LINQ provider as to the type (UserType, etc.). >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> Try to write an example where the Type can't be inferred. >>>>>>>>>>>> Thanks. >>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>>> If this sounds like a good idea, would anyone be able to provide >>>>>>>>>>>> a few pointers as to where to look to hook this in? I will take a >>>>>>>>>>>> look and >>>>>>>>>>>> see if I can patch. >>>>>>>>>>>> >>>>>>>>>>>> Thanks. >>>>>>>>>>>> >>>>>>>>>>>> On Mon, Aug 16, 2010 at 10:53 AM, Fabio Maulo >>>>>>>>>>>> <<[email protected]> >>>>>>>>>>>> [email protected]> wrote: >>>>>>>>>>>> >>>>>>>>>>>>> Known issue >>>>>>>>>>>>> <http://216.121.112.228/browse/NH/component/10120> >>>>>>>>>>>>> http://216.121.112.228/browse/NH/component/10120 >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> On Fri, Aug 13, 2010 at 2:54 PM, David Pfeffer >>>>>>>>>>>>> <<[email protected]> >>>>>>>>>>>>> [email protected]> wrote: >>>>>>>>>>>>> >>>>>>>>>>>>>> Hello all, >>>>>>>>>>>>>> >>>>>>>>>>>>>> So I'm having a bit of difficulty trying to build a LINQ to NH >>>>>>>>>>>>>> Spatial provider. Specifically, I have not found a way to >>>>>>>>>>>>>> specify the user >>>>>>>>>>>>>> type for IGeometry types. So, even though I have the backend >>>>>>>>>>>>>> LINQ parser >>>>>>>>>>>>>> code plugged in, queries fail due to "No persister for: >>>>>>>>>>>>>> GeoAPI.Geometries.IGeometry." >>>>>>>>>>>>>> >>>>>>>>>>>>>> In Criteria and HQL specifying the user type is easy. How do I >>>>>>>>>>>>>> specify the user type for a LINQ query so that my backend code >>>>>>>>>>>>>> is invoked? >>>>>>>>>>>>>> >>>>>>>>>>>>>> Thanks! >>>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>>> -- >>>>>>>>>>>>> Fabio Maulo >>>>>>>>>>>>> >>>>>>>>>>>>> >>>>>>>>>>>> >>>>>>>>>>> >>>>>>>>>> >>>>>>>>>> >>>>>>>>>> -- >>>>>>>>>> Fabio Maulo >>>>>>>>>> >>>>>>>>>> >>>>>>>>> >>>>>>>> >>>>>>>> >>>>>>>> -- >>>>>>>> Fabio Maulo >>>>>>>> >>>>>>>> >>>>>>> >>>>>> >>>>>> >>>>>> -- >>>>>> Fabio Maulo >>>>>> >>>>>> >>>>> >>>> >>>> >>>> -- >>>> Fabio Maulo >>>> >>>> >>> >> >> >> -- >> Fabio Maulo >> >> > -- Fabio Maulo
