Hi, Gunnar,
I just downloaded your fork, and I got this error in the NHibernate
project:
Source file 'C:\path\to\src\NHibernate\AssemblyInfo.cs' could not be
opened ('Unspecified error ')
I get similar errors for all of the Visual Studio projects. (I've
been working on other projects in the general sense and didn't get
back to this until just now.)
Any ideas?
Don
On Sep 6, 10:01 am, Gunnar Liljas <[email protected]> wrote:
> Download my fork:
>
> https://github.com/gliljas/nhibernate-core
>
> or just patch some stuff:
>
> https://github.com/gliljas/nhibernate-core/commit/5dff10fed53f200aa5d...
>
> It's not a major change. One new class, and one change in the
> SelectClauseVisitor class.
>
> The test case is actually not very good (cleaned it up before committing,and
> managed to remove the actual proof), so you can skip that.
>
> I can't make any guarantees, but I think that the problem will be solved in
> the next release, using my code or something else. It's invalid behavior,
> especially when things like aggregates and distinct comes into play.
>
> /G
>
> 2011/9/6 mysterd429 <[email protected]>
>
>
>
>
>
>
>
> > Gunnar,
>
> > Thank you again for your help. I was hoping that the mistake was
> > mine! Can your changes be merged into the latest stable revision?
> > I'm not familiar at all with the NHibernate source, but if it takes a
> > while for this fix to go in, I'll patch a local copy, try running the
> > NHibernate tests and my own tests, and see if I get something that
> > works.
>
> > Regards,
>
> > Don
>
> > On Sep 5, 4:23 pm, Gunnar Liljas <[email protected]> wrote:
> > > Hi,
>
> > > Kudos for providing a self contained test project. Much appreciated!
>
> > > I tried your code, and indeed, no function calls were included in the
> > > projection! After investigating a bit further I found that any part of
> > the
> > > expression tree which contains Constant expressions (in your case, the
> > > arguments to the extension method) will be executed locally, instead of
> > in
> > > HQL/SQL.
>
> > > I've submitted a pull request with code that fixes this. Hopefully it (or
> > > some other solution) will be accepted.
>
> > >https://github.com/nhibernate/nhibernate-core/pull/6
>
> > > /Gunnar
>
> > > 2011/9/1 mysterd429 <[email protected]>
>
> > > > Gunnar,
>
> > > > I sent you a link to a ZIP file with a sample that demonstrates the
> > > > issue. If we find a resolution, I'll post the problem and the
> > > > correction to the list.
>
> > > > Thank you again!
>
> > > > Don
>
> > > > On Aug 31, 11:31 am, Gunnar Liljas <[email protected]> wrote:
> > > > > How about..
>
> > > > > Session.Query<ResultObject>().Select(ro => new
> > > > > {Id=ro.Id,Rank=ro.DoSearch("foo", "bar")}).OrderBy(p =>p.Rank)
>
> > > > > ?
>
> > > > > /G
> > > > > 2011/8/31 mysterd429 <[email protected]>
>
> > > > > > When executing Session.Query<ResultObject>().OrderBy(ro =>
> > > > > > ro.DoSearch("foo", "bar").Select(ro => ro.DoSearch("foo", "bar").
>
> > > > > > On Aug 31, 10:34 am, mysterd429 <[email protected]>
> > wrote:
> > > > > > > Gunnar,
>
> > > > > > > Both of these examples mimic the SQL in .NET, which does not make
> > > > > > > sense for this application. There is no way to mimic the results
> > of
> > > > > > > FREETEXT (which my UDF wraps), so I'm a little confused: what is
> > the
> > > > > > > purpose of mimicking the SQL in .NET? My understanding based on
> > the
> > > > > > > articles that you provided was that the HQL generator would
> > always be
> > > > > > > used and that the method was just a placeholder. There is no
> > > > > > > mechanism to mimic my UDF.
>
> > > > > > > I implemented the BuildHql method (remarkably simple), and it's
> > used
> > > > > > > for OrderBy, but not for Select. If there is no way to force
> > > > > > > NHibernate to translate to HQL by both? Here's the SQL that I
> > get
> > > > > > > (formatted and with the names of our actual domain objects
> > removed):
>
> > > > > > > select
> > > > > > > resultobject0_.RESULT_OBJECT_ID
> > > > > > > , /* other properties */
> > > > > > > from
> > > > > > > RESULT_OBJECT resultobject0_
> > > > > > > order by
> > > > > > > (
> > > > > > > SELECT
> > > > > > > RANK
> > > > > > > FROM
> > > > > > > DO_SEARCH(@p0, @p1)
> > > > > > > WHERE
> > > > > > > RESULT_OBJECT_ID = resultobject0_.RESULT_OBJECT_ID
> > > > > > > ) asc
>
> > > > > > > I was expecting something more like this:
>
> > > > > > > select
> > > > > > > DO_SEARCH(@p0, @p1)
> > > > > > > from
> > > > > > > RESULT_OBJECT resultobject0_
> > > > > > > order by
> > > > > > > (
> > > > > > > SELECT
> > > > > > > RANK
> > > > > > > FROM
> > > > > > > DO_SEARCH(@p0, @p1)
> > > > > > > WHERE
> > > > > > > RESULT_OBJECT_ID = resultobject0_.RESULT_OBJECT_ID
> > > > > > > ) asc
>
> > > > > > > Thanks for your help. I appreciate it.
>
> > > > > > > On Aug 31, 10:04 am, Gunnar Liljas <[email protected]>
> > wrote:
>
> > > > > > > > That is what this article is all about.
>
> > > >http://www.primordialcode.com/blog/post/nhibernate-customize-linq-pro.
> > > > > > ..
>
> > > > > > > > or this
>
> > > >http://fabiomaulo.blogspot.com/2010/07/nhibernate-linq-provider-exten.
> > > > > > ..
>
> > > > > > > > /G
>
> > > > > > > > 2011/8/31 mysterd429 <[email protected]>
>
> > > > > > > > > Gunnar,
>
> > > > > > > > > Thanks for your help so far. I originally had a UDF, so I've
> > > > > > > > > converted back to the UDF. I've got an extension method for
> > > > > > > > > ResultObject called GetSearchRank, which takes the same
> > > > parameters as
> > > > > > > > > the UDF in addition the "this" parameter and returns -1
> > > > (temporarily
> > > > > > > > > for testing). I've created a dialect that is a subclass of
> > > > > > > > > MsSql2008Dialect, an HQL generator that is a subclass of
> > > > > > > > > BaseHqlGeneratorForMethod, and an HQL generators registry
> > that is
> > > > a
> > > > > > > > > subclass of another HQL generators registry common to all of
> > our
> > > > > > > > > projects (all it does it add the "trim" function for
> > strings.)
>
> > > > > > > > > When I try to run the code, the generator registry is getting
> > > > built,
> > > > > > > > > and execution goes to the BuildHql gets called (I've not yet
> > > > > > > > > implemented it) when I do
> > > > Session.Query<ResultObject>().OrderBy(ro =>
> > > > > > > > > ro.GetSearchRank("foo", "bar")), but when I do
> > > > > > > > > Session.Query<ResultObject>().Select(ro =>
> > > > ro.GetSearchRank("foo",
> > > > > > > > > "bar")), I just get a queryable full of -1.
>
> > > > > > > > > How can I get NHibernate to translate the method call to SQL
> > > > instead
> > > > > > > > > of executing it on the .NET side?
>
> > > > > > > > > Thanks!
>
> > > > > > > > > Don
>
> > > > > > > > > On Aug 30, 7:54 pm, Gunnar Liljas <[email protected]>
> > > > wrote:
> > > > > > > > > > Since you're inlining this in a SELECT, you should not use
> > your
> > > > SP.
> > > > > > > > > Either
> > > > > > > > > > use FREETEXTTABLE directly or create a UDF.
>
> > > > > > > > > > The steps are:
>
> > > > > > > > > > 1. Customize the SQL dialect and configure NHibernate to
> > use it
> > > > > > > > > > 2. Register the functions in the Linq provider
> > > > > > > > > > 3. Something like what you described.
>
> > > > > > > > > > /G
>
> > > > > > > > > > 2011/8/30 mysterd429 <[email protected]>
>
> > > > > > > > > > > Hi, Gunnar,
>
> > > > > > > > > > > Okay, that will work, I think. I would use my existing
> > > > stored
> > > > > > > > > > > procedure rather than FREETEXTTABLE. Would these be the
> > > > steps:
>
> > > > > > > > > > > 1. Customize the LINQ provider using something like
> > > > > > > > > > > RegisterFunction("GetRank", /* SQLFunctionTemplate or
> > > > > > > > > > > StandardSQLFunction, not sure, that calls DO_SEARCH using
> > > > T-SQL
> > > > > > */).
> > > > > > > > > > > 2. Do something like this:
>
> > > > > > > > > > > String field1, field2, field3;
> > > > > > > > > > > // assign field1, field2, field3
> > > > > > > > > > > IQueryable<SearchResult> queryable =
> > > > > > > > > > > Session.Query<ResultObject>().Select(ro => new
> > SearchResult
> > > > > > > > > > > { ResultObject = ro, Rank = GetRank(ro, field1, field2,
> > > > > > > > > > > field3) }).Where(ro => GetRank(ro, field1, field, field3)
> > ??
> > > > 0 >
> > > > > > 0);
> > > > > > > > > > > if(myUtilityInstance != null) queryable =
> > > > > > > > > > > myUtilityInstance.Paginate(queryable);
> > > > > > > > > > > results = queryable.ToList();
>
> > > > > > > > > > > Does that seem about right? Thanks so much for your
> > help!
>
> > > > > > > > > > > Regards,
>
> > > > > > > > > > > Don
>
> > > > > > > > > > > On Aug 30, 3:40 pm, Gunnar Liljas <
> > [email protected]>
> > > > > > wrote:
> > > > > > > > > > > > Hi,
>
> > > > > > > > > > > > While there may be ways to get the result set of a
> > stored
> > > > > > procedure
> > > > > > > > > into
> > > > > > > > > > > an
> > > > > > > > > > > > NhQueryable, it doesn't make much sense, since any
> > extra
> > > > Linq
> > > > > > > > > predicates
> > > > > > > > > > > you
> > > > > > > > > > > > apply will then by run on the full result set (when
> > paging
> > > > > > etc.), and
> > > > > > > > > if
> > > > > > > > > > > you
> > > > > > > > > > > > do that, you might just as well apply it after the
> > query,
> > > > with
> > > > > > in
> > > > > > > > > memory
> > > > > > > > > > > > operations.
>
> > > > > > > > > > > > I still think that a custom SQL function is feasible.
> > You
> > > > will
> > > > > > have
> > > > > > > > > to
> > > > > > > > > > > > reshape it into a scalar value...
>
> > > > > > > > > > > > SELECT ...., (SELECT [RANK] FROM
> > > > > > > > > FREETEXTTABLE(tableref,columnref,value)
> > > > > > > > > > > > WHERE [KEY]=tableref.Id) as [RANK] FROM ...
>
> > > > > > > > > > > > Maybe not easy, but doable.
>
> > > > > > > > > > > > /G
>
> > > > > > > > > > > > 2011/8/30 mysterd429 <[email protected]>
>
> > > > > > > > > > > > > Thanks for the reply, Gunnar. Unfortunately, I don't
> > see
> > > > how
> > > > > > I can
> > > > > > > > > > > > > use these links. I'm trying to use FREETEXTTABLE,
> > which
> > > > > > provides a
> > > > > > > > > > > > > result set with the search results, not FREETEXT,
> > which
> > > > is
> > > > > > scalar.
> > > > > > > > > I
> > > > > > > > > > > > > need to know not only that a row matches, but what
> > its
> > > > > > relative
> > > > > > > > > rank
>
> ...
>
> read more »
--
You received this message because you are subscribed to the Google Groups
"nhusers" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/nhusers?hl=en.