From: Fabio M. (JIRA) <nh...@gm...> - 2011-05-24 12:28:44
|
[ http://216.121.112.228/browse/NH-2735?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ] Fabio Maulo updated NH-2735: ---------------------------- Component/s: (was: Core) Linq Provider > Allow query on .id special accessor on <any> mappings via Linq > -------------------------------------------------------------- > > Key: NH-2735 > URL: http://216.121.112.228/browse/NH-2735 > Project: NHibernate > Issue Type: Improvement > Components: Linq Provider > Affects Versions: 3.2.0Beta1 > Reporter: Andrei Alecu > > Querying a property defined with an <any> mapping by its id needs to use the special .class and .id properties defined by HQL. > Not having a way to access .id makes it impossible to translate queries such as the following to Linq: > from ToyBox t where t.Shape.class = Square and t.Shape.id = 1 (note that there's currently a bug with .class at NH-2734) > Note that accessing the identifier property mapped as .Id (non lowercase) does not work, the HQL query parser complains that there's an access to an unmapped property .Id. > My current workaround is to define this extension method as a custom linq generator: > public class ImplicitIdGenerator : BaseHqlGeneratorForMethod > { > public ImplicitIdGenerator() > { > this.SupportedMethods = new[] { ReflectionHelper.GetMethodDefinition<object>(x => x.ImplicitId()) }; > } > public override HqlTreeNode BuildHql( > MethodInfo method, > Expression targetObject, > ReadOnlyCollection<Expression> arguments, > HqlTreeBuilder treeBuilder, > IHqlExpressionVisitor visitor) > { > return treeBuilder.Dot(visitor.Visit(arguments[0]).AsExpression(), treeBuilder.Ident("id")); > } > } > public static class NhibernateLinqExtensions > { > public static object ImplicitId(this object what) > { > throw new NotImplementedException("Used by NHibernate linq with <any> mappings."); > } > } > I believe the special .id property may also be used in other circumstances when the name of the property used for the identifier is not known. > I'm not sure if this is the most elegant implementation, but this code lets you do this: > var results = session.Query<ToyBox>().Where(x=> /* class constraint, see NH-2328 */ && x.Shape.ImplicitId() == 1); -- This message is automatically generated by JIRA. - If you think it was sent incorrectly contact one of the administrators: http://216.121.112.228/secure/Administrators.jspa - For more information on JIRA, see: http://www.atlassian.com/software/jira |