From: <ste...@us...> - 2009-10-22 14:52:49
|
Revision: 4794 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4794&view=rev Author: steverstrong Date: 2009-10-22 14:52:39 +0000 (Thu, 22 Oct 2009) Log Message: ----------- Linq modifications to integrate with the HQL Query cache Modified Paths: -------------- trunk/nhibernate/src/NHibernate/Engine/Query/HQLQueryPlan.cs trunk/nhibernate/src/NHibernate/Hql/Ast/HqlTreeNode.cs trunk/nhibernate/src/NHibernate/IQueryExpression.cs trunk/nhibernate/src/NHibernate/Impl/QueryImpl.cs trunk/nhibernate/src/NHibernate/Linq/CommandData.cs trunk/nhibernate/src/NHibernate/Linq/HqlGeneratorExpressionTreeVisitor.cs trunk/nhibernate/src/NHibernate/Linq/NhQueryable.cs trunk/nhibernate/src/NHibernate/Linq/ProjectionEvaluator.cs trunk/nhibernate/src/NHibernate/Linq/QueryModelVisitor.cs trunk/nhibernate/src/NHibernate/NHibernate.csproj trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj Modified: trunk/nhibernate/src/NHibernate/Engine/Query/HQLQueryPlan.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Engine/Query/HQLQueryPlan.cs 2009-10-18 21:21:57 UTC (rev 4793) +++ trunk/nhibernate/src/NHibernate/Engine/Query/HQLQueryPlan.cs 2009-10-22 14:52:39 UTC (rev 4794) @@ -132,11 +132,18 @@ querySpaces = new HashedSet<string>(translator.QuerySpaces); - // TODO - need to build parameterMetadata. Current function no good, since is parses the HQL. Might need to walk the AST here, - // probably inside the QueryTranslator. That's probably a better place for the parsing to be anyway; possibly worth moving for classic as well... - //parameterMetadata = BuildParameterMetadata(translator.GetParameterTranslations(), hql); - parameterMetadata = new ParameterMetadata(new OrdinalParameterDescriptor[0], new Dictionary<string, NamedParameterDescriptor>()); + var parameterTranslations = translator.GetParameterTranslations(); + var namedParamDescriptorMap = new Dictionary<string, NamedParameterDescriptor>(); + foreach (NamedParameterDescriptor entry in queryExpression.Parameters) + { + namedParamDescriptorMap[entry.Name] = + new NamedParameterDescriptor(entry.Name, parameterTranslations.GetNamedParameterExpectedType(entry.Name), + entry.SourceLocations, entry.JpaStyle); + } + + parameterMetadata = new ParameterMetadata(new OrdinalParameterDescriptor[0], namedParamDescriptorMap); + returnMetadata = new ReturnMetadata(translator.ReturnAliases, translator.ReturnTypes); } Modified: trunk/nhibernate/src/NHibernate/Hql/Ast/HqlTreeNode.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Hql/Ast/HqlTreeNode.cs 2009-10-18 21:21:57 UTC (rev 4793) +++ trunk/nhibernate/src/NHibernate/Hql/Ast/HqlTreeNode.cs 2009-10-22 14:52:39 UTC (rev 4794) @@ -117,6 +117,9 @@ switch (System.Type.GetTypeCode(type)) { + case TypeCode.Boolean: + _node.Text = "bool"; + break; case TypeCode.Int32: _node.Text = "integer"; break; @@ -126,6 +129,9 @@ case TypeCode.DateTime: _node.Text = "datetime"; break; + case TypeCode.String: + _node.Text = "string"; + break; default: throw new NotSupportedException(string.Format("Don't currently support idents of type {0}", type.Name)); } @@ -239,8 +245,9 @@ public class HqlParameter : HqlTreeNode { public HqlParameter(IASTFactory factory, string name) - : base(HqlSqlWalker.PARAM, name, factory) + : base(HqlSqlWalker.COLON, ":", factory) { + AddChild(new HqlIdent(factory, name)); } } Modified: trunk/nhibernate/src/NHibernate/IQueryExpression.cs =================================================================== --- trunk/nhibernate/src/NHibernate/IQueryExpression.cs 2009-10-18 21:21:57 UTC (rev 4793) +++ trunk/nhibernate/src/NHibernate/IQueryExpression.cs 2009-10-22 14:52:39 UTC (rev 4794) @@ -1,4 +1,5 @@ -using NHibernate.Engine; +using System.Collections.Generic; +using NHibernate.Engine.Query; using NHibernate.Hql.Ast.ANTLR.Tree; using NHibernate.Impl; @@ -9,6 +10,7 @@ IASTNode Translate(ISessionFactory sessionFactory); string Key { get; } System.Type Type { get; } - void SetQueryParametersPriorToExecute(QueryImpl impl); + IList<NamedParameterDescriptor> Parameters { get; } + void SetQueryParametersPriorToExecute(QueryImpl impl); } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Impl/QueryImpl.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/QueryImpl.cs 2009-10-18 21:21:57 UTC (rev 4793) +++ trunk/nhibernate/src/NHibernate/Impl/QueryImpl.cs 2009-10-22 14:52:39 UTC (rev 4794) @@ -63,6 +63,11 @@ public override IList List() { + if (_queryExpression != null) + { + _queryExpression.SetQueryParametersPriorToExecute(this); + } + VerifyParameters(); IDictionary<string, TypedValue> namedParams = NamedParams; Before(); @@ -74,7 +79,6 @@ } else { - _queryExpression.SetQueryParametersPriorToExecute(this); return Session.List(_queryExpression, GetQueryParameters(namedParams)); } } Modified: trunk/nhibernate/src/NHibernate/Linq/CommandData.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Linq/CommandData.cs 2009-10-18 21:21:57 UTC (rev 4793) +++ trunk/nhibernate/src/NHibernate/Linq/CommandData.cs 2009-10-22 14:52:39 UTC (rev 4794) @@ -8,28 +8,26 @@ { public class CommandData { - private readonly NamedParameter[] _namedParameters; - private readonly List<LambdaExpression> _itemTransformers; + private readonly List<LambdaExpression> _itemTransformers; private readonly List<LambdaExpression> _listTransformers; private readonly List<Action<IQuery>> _additionalCriteria; - public CommandData(HqlQuery statement, NamedParameter[] namedParameters, List<LambdaExpression> itemTransformers, List<LambdaExpression> listTransformers, List<Action<IQuery>> additionalCriteria) + public CommandData(HqlQuery statement, List<LambdaExpression> itemTransformers, List<LambdaExpression> listTransformers, List<Action<IQuery>> additionalCriteria) { _itemTransformers = itemTransformers; _listTransformers = listTransformers; Statement = statement; - _namedParameters = namedParameters; - _additionalCriteria = additionalCriteria; + _additionalCriteria = additionalCriteria; } public HqlQuery Statement { get; private set; } - public void SetParameters(IQuery query) + public void SetParameters(IQuery query, IDictionary<string, object> parameters) { - foreach (var parameter in _namedParameters) + foreach (var parameterName in query.NamedParameters) { - query.SetParameter(parameter.Name, parameter.Value); + query.SetParameter(parameterName, parameters[parameterName]); } } Modified: trunk/nhibernate/src/NHibernate/Linq/HqlGeneratorExpressionTreeVisitor.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Linq/HqlGeneratorExpressionTreeVisitor.cs 2009-10-18 21:21:57 UTC (rev 4793) +++ trunk/nhibernate/src/NHibernate/Linq/HqlGeneratorExpressionTreeVisitor.cs 2009-10-22 14:52:39 UTC (rev 4794) @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; +using NHibernate.Engine.Query; using NHibernate.Hql.Ast; using Remotion.Data.Linq.Clauses.Expressions; using Remotion.Data.Linq.Clauses.ExpressionTreeVisitors; @@ -12,12 +13,14 @@ { protected readonly HqlTreeBuilder _hqlTreeBuilder; protected readonly HqlNodeStack _stack; - private readonly ParameterAggregator _parameterAggregator; + private readonly IDictionary<ConstantExpression, NamedParameter> _parameters; + private readonly IList<NamedParameterDescriptor> _requiredHqlParameters; - public HqlGeneratorExpressionTreeVisitor(ParameterAggregator parameterAggregator) + public HqlGeneratorExpressionTreeVisitor(IDictionary<ConstantExpression, NamedParameter> parameters, IList<NamedParameterDescriptor> requiredHqlParameters) { - _parameterAggregator = parameterAggregator; - _hqlTreeBuilder = new HqlTreeBuilder(); + _parameters = parameters; + _requiredHqlParameters = requiredHqlParameters; + _hqlTreeBuilder = new HqlTreeBuilder(); _stack = new HqlNodeStack(_hqlTreeBuilder); } @@ -33,7 +36,7 @@ protected override Expression VisitNhAverage(NhAverageExpression expression) { - var visitor = new HqlGeneratorExpressionTreeVisitor(_parameterAggregator); + var visitor = new HqlGeneratorExpressionTreeVisitor(_parameters, _requiredHqlParameters); visitor.Visit(expression.Expression); _stack.PushLeaf(_hqlTreeBuilder.Cast(_hqlTreeBuilder.Average(visitor.GetHqlTreeNodes().Single()), expression.Type)); @@ -43,7 +46,7 @@ protected override Expression VisitNhCount(NhCountExpression expression) { - var visitor = new HqlGeneratorExpressionTreeVisitor(_parameterAggregator); + var visitor = new HqlGeneratorExpressionTreeVisitor(_parameters, _requiredHqlParameters); visitor.Visit(expression.Expression); _stack.PushLeaf(_hqlTreeBuilder.Cast(_hqlTreeBuilder.Count(visitor.GetHqlTreeNodes().Single()), expression.Type)); @@ -53,7 +56,7 @@ protected override Expression VisitNhMin(NhMinExpression expression) { - var visitor = new HqlGeneratorExpressionTreeVisitor(_parameterAggregator); + var visitor = new HqlGeneratorExpressionTreeVisitor(_parameters, _requiredHqlParameters); visitor.Visit(expression.Expression); _stack.PushLeaf(_hqlTreeBuilder.Cast(_hqlTreeBuilder.Min(visitor.GetHqlTreeNodes().Single()), expression.Type)); @@ -63,7 +66,7 @@ protected override Expression VisitNhMax(NhMaxExpression expression) { - var visitor = new HqlGeneratorExpressionTreeVisitor(_parameterAggregator); + var visitor = new HqlGeneratorExpressionTreeVisitor(_parameters, _requiredHqlParameters); visitor.Visit(expression.Expression); _stack.PushLeaf(_hqlTreeBuilder.Cast(_hqlTreeBuilder.Max(visitor.GetHqlTreeNodes().Single()), expression.Type)); @@ -73,7 +76,7 @@ protected override Expression VisitNhSum(NhSumExpression expression) { - var visitor = new HqlGeneratorExpressionTreeVisitor(_parameterAggregator); + var visitor = new HqlGeneratorExpressionTreeVisitor(_parameters, _requiredHqlParameters); visitor.Visit(expression.Expression); _stack.PushLeaf(_hqlTreeBuilder.Cast(_hqlTreeBuilder.Sum(visitor.GetHqlTreeNodes().Single()), expression.Type)); @@ -83,7 +86,7 @@ protected override Expression VisitNhDistinct(NhDistinctExpression expression) { - var visitor = new HqlGeneratorExpressionTreeVisitor(_parameterAggregator); + var visitor = new HqlGeneratorExpressionTreeVisitor(_parameters, _requiredHqlParameters); visitor.Visit(expression.Expression); _stack.PushLeaf(_hqlTreeBuilder.Distinct()); @@ -216,17 +219,19 @@ } } - /* - var namedParameter = _parameterAggregator.AddParameter(expression.Value); + NamedParameter namedParameter; - _expression = _hqlTreeBuilder.Parameter(namedParameter.Name); + if (_parameters.TryGetValue(expression, out namedParameter)) + { + _stack.PushLeaf(_hqlTreeBuilder.Cast(_hqlTreeBuilder.Parameter(namedParameter.Name), namedParameter.Value.GetType())); + _requiredHqlParameters.Add(new NamedParameterDescriptor(namedParameter.Name, null, new []{ _requiredHqlParameters.Count + 1}, false)); + } + else + { + _stack.PushLeaf(_hqlTreeBuilder.Constant(expression.Value)); + } return expression; - */ - // TODO - get parameter support in place in the HQLQueryPlan - _stack.PushLeaf(_hqlTreeBuilder.Constant(expression.Value)); - - return expression; } protected override Expression VisitMethodCallExpression(MethodCallExpression expression) @@ -331,7 +336,7 @@ protected override Expression VisitSubQueryExpression(SubQueryExpression expression) { - CommandData query = QueryModelVisitor.GenerateHqlQuery(expression.QueryModel, _parameterAggregator); + CommandData query = QueryModelVisitor.GenerateHqlQuery(expression.QueryModel, _parameters, _requiredHqlParameters); _stack.PushLeaf(query.Statement); Modified: trunk/nhibernate/src/NHibernate/Linq/NhQueryable.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Linq/NhQueryable.cs 2009-10-18 21:21:57 UTC (rev 4793) +++ trunk/nhibernate/src/NHibernate/Linq/NhQueryable.cs 2009-10-22 14:52:39 UTC (rev 4794) @@ -1,9 +1,13 @@ using System; +using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; +using NHibernate.Engine.Query; using NHibernate.Hql.Ast.ANTLR.Tree; using NHibernate.Impl; using Remotion.Data.Linq; +using Remotion.Data.Linq.Parsing; +using Remotion.Data.Linq.Parsing.ExpressionTreeVisitors; using Remotion.Data.Linq.Parsing.Structure; namespace NHibernate.Linq @@ -75,15 +79,21 @@ { private readonly Expression _expression; private CommandData _commandData; + private readonly IDictionary<ConstantExpression, NamedParameter> _queryParameters; + private readonly IDictionary<string, object> _queryParameterValues; public NhLinqExpression(Expression expression) { - _expression = expression; + _expression = PartialEvaluatingExpressionTreeVisitor.EvaluateIndependentSubtrees(expression); - Key = expression.ToString(); + _queryParameters = ExpressionParameterVisitor.Visit(_expression); + _queryParameterValues = _queryParameters.Values.ToDictionary(p => p.Name, p => p.Value); - Type = expression.Type; + Key = ExpressionKeyVisitor.Visit(_expression, _queryParameters); + Type = _expression.Type; + ParameterValues = _queryParameters.Values; + // Note - re-linq handles return types via the GetOutputDataInfo method, and allows for SingleOrDefault here for the ChoiceResultOperator... ReturnType = NhLinqExpressionReturnType.Scalar; @@ -94,26 +104,57 @@ } } - public IASTNode Translate(ISessionFactory sessionFactory) + public IASTNode Translate(ISessionFactory sessionFactory) { + var requiredHqlParameters = new List<NamedParameterDescriptor>(); var queryModel = new QueryParser(new ExpressionTreeParser(MethodCallExpressionNodeTypeRegistry.CreateDefault())).GetParsedQuery(_expression); - _commandData = QueryModelVisitor.GenerateHqlQuery(queryModel); + _commandData = QueryModelVisitor.GenerateHqlQuery(queryModel, _queryParameters, requiredHqlParameters); + Parameters = requiredHqlParameters.AsReadOnly(); + return _commandData.Statement.AstNode; } public string Key { get; private set; } + public IList<NamedParameterDescriptor> Parameters { get; private set; } + + public ICollection<NamedParameter> ParameterValues { get; private set; } + public NhLinqExpressionReturnType ReturnType { get; private set; } public System.Type Type { get; private set; } public void SetQueryParametersPriorToExecute(QueryImpl impl) { - _commandData.SetParameters(impl); + _commandData.SetParameters(impl, _queryParameterValues); _commandData.SetResultTransformer(impl); _commandData.AddAdditionalCriteria(impl); } } + + public class ExpressionParameterVisitor : ExpressionTreeVisitor + { + private readonly Dictionary<ConstantExpression, NamedParameter> _parameters = new Dictionary<ConstantExpression, NamedParameter>(); + + public static IDictionary<ConstantExpression, NamedParameter> Visit(Expression expression) + { + var visitor = new ExpressionParameterVisitor(); + + visitor.VisitExpression(expression); + + return visitor._parameters; + } + + protected override Expression VisitConstantExpression(ConstantExpression expression) + { + if (!typeof(IQueryable).IsAssignableFrom(expression.Type)) + { + _parameters.Add(expression, new NamedParameter("p" + (_parameters.Count + 1), expression.Value)); + } + + return base.VisitConstantExpression(expression); + } + } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Linq/ProjectionEvaluator.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Linq/ProjectionEvaluator.cs 2009-10-18 21:21:57 UTC (rev 4793) +++ trunk/nhibernate/src/NHibernate/Linq/ProjectionEvaluator.cs 2009-10-22 14:52:39 UTC (rev 4794) @@ -1,6 +1,7 @@ using System; using System.Collections.Generic; using System.Linq.Expressions; +using NHibernate.Engine.Query; using NHibernate.Hql.Ast; using Remotion.Data.Linq.Parsing; @@ -10,18 +11,20 @@ { protected readonly HqlTreeBuilder _hqlTreeBuilder; protected readonly HqlNodeStack _stack; - private readonly ParameterAggregator _parameterAggregator; private HashSet<Expression> _hqlNodes; private readonly ParameterExpression _inputParameter; private readonly Func<Expression, bool> _predicate; - private int _iColumn; + private readonly IDictionary<ConstantExpression, NamedParameter> _parameters; + private readonly IList<NamedParameterDescriptor> _requiredHqlParameters; + private int _iColumn; - public ProjectionEvaluator(ParameterAggregator parameterAggregator, System.Type inputType, Func<Expression, bool> predicate) + public ProjectionEvaluator(System.Type inputType, Func<Expression, bool> predicate, IDictionary<ConstantExpression, NamedParameter> parameters, IList<NamedParameterDescriptor> requiredHqlParameters) { - _parameterAggregator = parameterAggregator; _inputParameter = Expression.Parameter(inputType, "input"); _predicate = predicate; - _hqlTreeBuilder = new HqlTreeBuilder(); + _parameters = parameters; + _requiredHqlParameters = requiredHqlParameters; + _hqlTreeBuilder = new HqlTreeBuilder(); _stack = new HqlNodeStack(_hqlTreeBuilder); } @@ -56,7 +59,7 @@ if (_hqlNodes.Contains(expression)) { // Pure HQL evaluation - var hqlVisitor = new HqlGeneratorExpressionTreeVisitor(_parameterAggregator); + var hqlVisitor = new HqlGeneratorExpressionTreeVisitor(_parameters, _requiredHqlParameters); hqlVisitor.Visit(expression); hqlVisitor.GetHqlTreeNodes().ForEach(n =>_stack.PushLeaf(n) ); Modified: trunk/nhibernate/src/NHibernate/Linq/QueryModelVisitor.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Linq/QueryModelVisitor.cs 2009-10-18 21:21:57 UTC (rev 4793) +++ trunk/nhibernate/src/NHibernate/Linq/QueryModelVisitor.cs 2009-10-22 14:52:39 UTC (rev 4794) @@ -3,6 +3,7 @@ using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; +using NHibernate.Engine.Query; using NHibernate.Hql.Ast; using Remotion.Data.Linq; using Remotion.Data.Linq.Clauses; @@ -14,7 +15,6 @@ public class QueryModelVisitor : QueryModelVisitorBase { private readonly HqlTreeBuilder _hqlTreeBuilder; - private readonly ParameterAggregator _parameterAggregator; private readonly List<Action<IQuery>> _additionalCriteria = new List<Action<IQuery>>(); private readonly List<LambdaExpression> _listTransformers = new List<LambdaExpression>(); @@ -27,20 +27,18 @@ private HqlSelect _selectClause; private ResultOperatorProcessingMode _resultOperatorProcessingMode; + private readonly IDictionary<ConstantExpression, NamedParameter> _parameters; + private readonly IList<NamedParameterDescriptor> _requiredHqlParameters; - private QueryModelVisitor(ParameterAggregator parameterAggregator) + private QueryModelVisitor(IDictionary<ConstantExpression, NamedParameter> parameters, IList<NamedParameterDescriptor> requiredHqlParameters) { + _parameters = parameters; + _requiredHqlParameters = requiredHqlParameters; _hqlTreeBuilder = new HqlTreeBuilder(); - _parameterAggregator = parameterAggregator; } - public static CommandData GenerateHqlQuery(QueryModel queryModel) + public static CommandData GenerateHqlQuery(QueryModel queryModel, IDictionary<ConstantExpression, NamedParameter> parameters, IList<NamedParameterDescriptor> requiredHqlParameters) { - return GenerateHqlQuery(queryModel, new ParameterAggregator()); - } - - public static CommandData GenerateHqlQuery(QueryModel queryModel, ParameterAggregator aggregator) - { // Merge aggregating result operators (distinct, count, sum etc) into the select clause new MergeAggregatingResultsRewriter().ReWrite(queryModel); @@ -56,7 +54,7 @@ // Flatten pointless subqueries new QueryReferenceExpressionFlattener().ReWrite(queryModel); - var visitor = new QueryModelVisitor(aggregator); + var visitor = new QueryModelVisitor(parameters, requiredHqlParameters); visitor.VisitQueryModel(queryModel); return visitor.GetHqlCommand(); } @@ -100,7 +98,6 @@ } return new CommandData(query, - _parameterAggregator.GetParameters(), _itemTransformers, _listTransformers, _additionalCriteria); @@ -144,7 +141,7 @@ public override void VisitMainFromClause(MainFromClause fromClause, QueryModel queryModel) { - var visitor = new HqlGeneratorExpressionTreeVisitor(_parameterAggregator); + var visitor = new HqlGeneratorExpressionTreeVisitor(_parameters, _requiredHqlParameters); visitor.Visit(fromClause.FromExpression); _fromClauses.Add(_hqlTreeBuilder.Range( @@ -278,7 +275,7 @@ private void ProcessGroupByOperator(GroupResultOperator resultOperator) { - var visitor = new HqlGeneratorExpressionTreeVisitor(_parameterAggregator); + var visitor = new HqlGeneratorExpressionTreeVisitor(_parameters, _requiredHqlParameters); visitor.Visit(resultOperator.KeySelector); _groupByClause = _hqlTreeBuilder.GroupBy(); _groupByClause.AddChild(visitor.GetHqlTreeNodes().Single()); @@ -301,7 +298,7 @@ return; } - var visitor = new ProjectionEvaluator(_parameterAggregator, typeof(object[]), CanBeEvaluatedInHqlSelectStatement); + var visitor = new ProjectionEvaluator(typeof(object[]), CanBeEvaluatedInHqlSelectStatement, _parameters, _requiredHqlParameters); visitor.Visit(selectClause.Selector); @@ -318,7 +315,7 @@ public override void VisitWhereClause(WhereClause whereClause, QueryModel queryModel, int index) { // Visit the predicate to build the query - var visitor = new HqlGeneratorExpressionTreeVisitor(_parameterAggregator); + var visitor = new HqlGeneratorExpressionTreeVisitor(_parameters, _requiredHqlParameters); visitor.Visit(whereClause.Predicate); // There maybe a where clause in existence already, in which case we AND with it. @@ -331,7 +328,7 @@ foreach (Ordering clause in orderByClause.Orderings) { - var visitor = new HqlGeneratorExpressionTreeVisitor(_parameterAggregator); + var visitor = new HqlGeneratorExpressionTreeVisitor(_parameters, _requiredHqlParameters); visitor.Visit(clause.Expression); _orderByClause.AddChild(visitor.GetHqlTreeNodes().Single()); @@ -345,13 +342,13 @@ public override void VisitJoinClause(JoinClause joinClause, QueryModel queryModel, int index) { - var fromVisitor = new HqlGeneratorExpressionTreeVisitor(_parameterAggregator); + var fromVisitor = new HqlGeneratorExpressionTreeVisitor(_parameters, _requiredHqlParameters); fromVisitor.Visit(joinClause.InnerSequence); - var innerKey = new HqlGeneratorExpressionTreeVisitor(_parameterAggregator); + var innerKey = new HqlGeneratorExpressionTreeVisitor(_parameters, _requiredHqlParameters); innerKey.Visit(joinClause.InnerKeySelector); - var outerKey = new HqlGeneratorExpressionTreeVisitor(_parameterAggregator); + var outerKey = new HqlGeneratorExpressionTreeVisitor(_parameters, _requiredHqlParameters); outerKey.Visit(joinClause.OuterKeySelector); _whereClauses.Add(_hqlTreeBuilder.Equality(innerKey.GetHqlTreeNodes().Single(), outerKey.GetHqlTreeNodes().Single())); @@ -369,7 +366,7 @@ if (member.Expression is QuerySourceReferenceExpression) { // It's a join - var visitor = new HqlGeneratorExpressionTreeVisitor(_parameterAggregator); + var visitor = new HqlGeneratorExpressionTreeVisitor(_parameters, _requiredHqlParameters); visitor.Visit(fromClause.FromExpression); _fromClauses.Add(_hqlTreeBuilder.Join( Modified: trunk/nhibernate/src/NHibernate/NHibernate.csproj =================================================================== --- trunk/nhibernate/src/NHibernate/NHibernate.csproj 2009-10-18 21:21:57 UTC (rev 4793) +++ trunk/nhibernate/src/NHibernate/NHibernate.csproj 2009-10-22 14:52:39 UTC (rev 4794) @@ -569,6 +569,7 @@ <Compile Include="Criterion\QueryOver.cs" /> <Compile Include="Impl\ExpressionProcessor.cs" /> <Compile Include="Impl\SessionIdLoggingContext.cs" /> + <Compile Include="Linq\ExpressionKeyVisitor.cs" /> <Compile Include="Linq\GroupByAggregateDetectionVisitor.cs" /> <Compile Include="Linq\AggregatingGroupByRewriter.cs" /> <Compile Include="Linq\AggregatingGroupJoinRewriter.cs" /> Modified: trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj =================================================================== --- trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-10-18 21:21:57 UTC (rev 4793) +++ trunk/nhibernate/src/NHibernate.Test/NHibernate.Test.csproj 2009-10-22 14:52:39 UTC (rev 4794) @@ -62,6 +62,10 @@ <SpecificVersion>False</SpecificVersion> <HintPath>..\..\lib\net\3.5\nunit.framework.dll</HintPath> </Reference> + <Reference Include="Remotion.Data.Linq, Version=1.13.9.2, Culture=neutral, PublicKeyToken=cab60358ab4081ea, processorArchitecture=MSIL"> + <SpecificVersion>False</SpecificVersion> + <HintPath>..\..\lib\net\3.5\Remotion.Data.Linq.dll</HintPath> + </Reference> <Reference Include="System" /> <Reference Include="System.configuration" /> <Reference Include="System.Core"> @@ -383,6 +387,7 @@ <Compile Include="Linq\Entities\Territory.cs" /> <Compile Include="Linq\LinqQuerySamples.cs" /> <Compile Include="Linq\LinqTestCase.cs" /> + <Compile Include="Linq\ParameterisedQueries.cs" /> <Compile Include="Linq\ReadonlyTestCase.cs" /> <Compile Include="MappingTest\NonReflectiveBinderFixture.cs" /> <Compile Include="MappingTest\Wicked.cs" /> This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |