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

Reply via email to