From: <ste...@us...> - 2009-11-25 20:17:08
|
Revision: 4858 http://nhibernate.svn.sourceforge.net/nhibernate/?rev=4858&view=rev Author: steverstrong Date: 2009-11-25 20:16:50 +0000 (Wed, 25 Nov 2009) Log Message: ----------- Added additional Linq tests and upgraded to latest re-linq trunk Modified Paths: -------------- trunk/nhibernate/lib/net/3.5/Remotion.Data.Linq.dll trunk/nhibernate/lib/net/3.5/Remotion.Interfaces.dll trunk/nhibernate/lib/net/3.5/Remotion.dll trunk/nhibernate/src/NHibernate/IQueryExpression.cs trunk/nhibernate/src/NHibernate/Impl/AbstractSessionImpl.cs trunk/nhibernate/src/NHibernate/Impl/QueryImpl.cs trunk/nhibernate/src/NHibernate/Linq/NhLinqExpression.cs trunk/nhibernate/src/NHibernate/Linq/NhQueryProvider.cs trunk/nhibernate/src/NHibernate/Linq/Visitors/ExpressionKeyVisitor.cs trunk/nhibernate/src/NHibernate/Linq/Visitors/HqlGeneratorExpressionTreeVisitor.cs trunk/nhibernate/src/NHibernate/Linq/Visitors/QueryModelVisitor.cs trunk/nhibernate/src/NHibernate/NHibernate.csproj trunk/nhibernate/src/NHibernate.Test/Linq/MethodCallTests.cs trunk/nhibernate/src/NHibernate.Test/Linq/MiscellaneousTextFixture.cs trunk/nhibernate/src/NHibernate.Test/Linq/ParameterisedQueries.cs Added Paths: ----------- trunk/nhibernate/src/NHibernate/Impl/ExpressionQueryImpl.cs trunk/nhibernate/src/NHibernate/Linq/ExpressionToHqlTranslationResults.cs trunk/nhibernate/src/NHibernate/Linq/ReWriters/RemoveUnnecessaryBodyOperators.cs Modified: trunk/nhibernate/lib/net/3.5/Remotion.Data.Linq.dll =================================================================== (Binary files differ) Modified: trunk/nhibernate/lib/net/3.5/Remotion.Interfaces.dll =================================================================== (Binary files differ) Modified: trunk/nhibernate/lib/net/3.5/Remotion.dll =================================================================== (Binary files differ) Modified: trunk/nhibernate/src/NHibernate/IQueryExpression.cs =================================================================== --- trunk/nhibernate/src/NHibernate/IQueryExpression.cs 2009-11-25 18:36:07 UTC (rev 4857) +++ trunk/nhibernate/src/NHibernate/IQueryExpression.cs 2009-11-25 20:16:50 UTC (rev 4858) @@ -11,6 +11,5 @@ string Key { get; } System.Type Type { get; } IList<NamedParameterDescriptor> ParameterDescriptors { get; } - void SetQueryPropertiesPriorToExecute(IQuery impl); } } \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Impl/AbstractSessionImpl.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/AbstractSessionImpl.cs 2009-11-25 18:36:07 UTC (rev 4857) +++ trunk/nhibernate/src/NHibernate/Impl/AbstractSessionImpl.cs 2009-11-25 20:16:50 UTC (rev 4858) @@ -258,8 +258,8 @@ using (new SessionIdLoggingContext(SessionId)) { CheckAndUpdateSessionStatus(); - HQLQueryPlan queryPlan = GetHQLQueryPlan(queryExpression, false); - QueryImpl query = new QueryImpl(queryPlan.QueryExpression, + var queryPlan = GetHQLQueryPlan(queryExpression, false); + var query = new ExpressionQueryImpl(queryPlan.QueryExpression, this, queryPlan.ParameterMetadata ); Added: trunk/nhibernate/src/NHibernate/Impl/ExpressionQueryImpl.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/ExpressionQueryImpl.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Impl/ExpressionQueryImpl.cs 2009-11-25 20:16:50 UTC (rev 4858) @@ -0,0 +1,72 @@ +using System; +using System.Collections; +using System.Collections.Generic; +using NHibernate.Engine; +using NHibernate.Engine.Query; + +namespace NHibernate.Impl +{ + class ExpressionQueryImpl : AbstractQueryImpl + { + private readonly Dictionary<string, LockMode> _lockModes = new Dictionary<string, LockMode>(2); + + public IQueryExpression QueryExpression { get; private set; } + + public ExpressionQueryImpl(IQueryExpression queryExpression, ISessionImplementor session, ParameterMetadata parameterMetadata) + : base(queryExpression.Key, FlushMode.Unspecified, session, parameterMetadata) + { + QueryExpression = queryExpression; + } + + public override IQuery SetLockMode(string alias, LockMode lockMode) + { + _lockModes[alias] = lockMode; + return this; + } + + protected internal override IDictionary<string, LockMode> LockModes + { + get { return _lockModes; } + } + + public override int ExecuteUpdate() + { + throw new NotImplementedException(); + } + + public override IEnumerable Enumerable() + { + throw new NotImplementedException(); + } + + public override IEnumerable<T> Enumerable<T>() + { + throw new NotImplementedException(); + } + + public override IList List() + { + VerifyParameters(); + IDictionary<string, TypedValue> namedParams = NamedParams; + Before(); + try + { + return Session.List(QueryExpression, GetQueryParameters(namedParams)); + } + finally + { + After(); + } + } + + public override void List(IList results) + { + throw new NotImplementedException(); + } + + public override IList<T> List<T>() + { + throw new NotImplementedException(); + } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Impl/QueryImpl.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Impl/QueryImpl.cs 2009-11-25 18:36:07 UTC (rev 4857) +++ trunk/nhibernate/src/NHibernate/Impl/QueryImpl.cs 2009-11-25 20:16:50 UTC (rev 4858) @@ -13,7 +13,6 @@ public class QueryImpl : AbstractQueryImpl { private readonly Dictionary<string, LockMode> lockModes = new Dictionary<string, LockMode>(2); - private readonly IQueryExpression _queryExpression; public QueryImpl(string queryString, FlushMode flushMode, ISessionImplementor session, ParameterMetadata parameterMetadata) : base(queryString, flushMode, session, parameterMetadata) @@ -25,12 +24,6 @@ { } - public QueryImpl(IQueryExpression queryExpression, ISessionImplementor session, ParameterMetadata parameterMetadata) - : base(queryExpression.Key, FlushMode.Unspecified, session, parameterMetadata) - { - _queryExpression = queryExpression; - } - public override IEnumerable Enumerable() { VerifyParameters(); @@ -68,15 +61,7 @@ Before(); try { - if (_queryExpression == null) - { - return Session.List(ExpandParameterLists(namedParams), GetQueryParameters(namedParams)); - } - else - { - _queryExpression.SetQueryPropertiesPriorToExecute(this); - return Session.List(_queryExpression, GetQueryParameters(namedParams)); - } + return Session.List(ExpandParameterLists(namedParams), GetQueryParameters(namedParams)); } finally { Added: trunk/nhibernate/src/NHibernate/Linq/ExpressionToHqlTranslationResults.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Linq/ExpressionToHqlTranslationResults.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Linq/ExpressionToHqlTranslationResults.cs 2009-11-25 20:16:50 UTC (rev 4858) @@ -0,0 +1,49 @@ +using System; +using System.Collections.Generic; +using System.Linq; +using System.Linq.Expressions; +using NHibernate.Hql.Ast; + +namespace NHibernate.Linq +{ + public class ExpressionToHqlTranslationResults + { + public HqlQuery Statement { get; private set; } + public ResultTransformer ResultTransformer { get; private set; } + public List<Action<IQuery, IDictionary<string, object>>> AdditionalCriteria { get; private set; } + + public ExpressionToHqlTranslationResults(HqlQuery statement, IList<LambdaExpression> itemTransformers, IList<LambdaExpression> listTransformers, List<Action<IQuery, IDictionary<string, object>>> additionalCriteria) + { + Statement = statement; + + var itemTransformer = MergeLambdas(itemTransformers); + var listTransformer = MergeLambdas(listTransformers); + + if (itemTransformer != null || listTransformer != null) + { + ResultTransformer = new ResultTransformer(itemTransformer, listTransformer); + } + + AdditionalCriteria = additionalCriteria; + } + + private static LambdaExpression MergeLambdas(IList<LambdaExpression> transformations) + { + if (transformations == null || transformations.Count == 0) + { + return null; + } + + var listTransformLambda = transformations[0]; + + for (int i = 1; i < transformations.Count; i++) + { + var invoked = Expression.Invoke(transformations[i], listTransformLambda.Body); + + listTransformLambda = Expression.Lambda(invoked, listTransformLambda.Parameters.ToArray()); + } + + return listTransformLambda; + } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Linq/NhLinqExpression.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Linq/NhLinqExpression.cs 2009-11-25 18:36:07 UTC (rev 4857) +++ trunk/nhibernate/src/NHibernate/Linq/NhLinqExpression.cs 2009-11-25 20:16:50 UTC (rev 4858) @@ -6,6 +6,7 @@ using NHibernate.Hql.Ast.ANTLR.Tree; using NHibernate.Linq.ResultOperators; using NHibernate.Linq.Visitors; +using Remotion.Data.Linq; using Remotion.Data.Linq.Clauses; using Remotion.Data.Linq.Clauses.StreamedData; using Remotion.Data.Linq.Parsing.ExpressionTreeVisitors; @@ -16,24 +17,20 @@ { public class NhLinqExpression : IQueryExpression { - private static readonly MethodCallExpressionNodeTypeRegistry MethodCallRegistry = - MethodCallExpressionNodeTypeRegistry.CreateDefault(); + public string Key { get; private set; } - static NhLinqExpression() - { - MethodCallRegistry.Register( - new[] - { - MethodCallExpressionNodeTypeRegistry.GetRegisterableMethodDefinition(ReflectionHelper.GetMethod(() => Queryable.Aggregate<object>(null, null))), - MethodCallExpressionNodeTypeRegistry.GetRegisterableMethodDefinition(ReflectionHelper.GetMethod(() => Queryable.Aggregate<object, object>(null, null, null))) - }, - typeof (AggregateExpressionNode)); - } + public System.Type Type { get; private set; } + public IList<NamedParameterDescriptor> ParameterDescriptors { get; private set; } + public NhLinqExpressionReturnType ReturnType { get; private set; } + + public IDictionary<string, object> ParameterValuesByName { get; private set; } + + public ExpressionToHqlTranslationResults ExpressionToHqlTranslationResults { get; private set; } + private readonly Expression _expression; - private CommandData _commandData; - private readonly IDictionary<ConstantExpression, NamedParameter> _queryParameters; + private readonly IDictionary<ConstantExpression, NamedParameter> _constantToParameterMap; public NhLinqExpression(Expression expression) { @@ -41,13 +38,13 @@ _expression = NameUnNamedParameters.Visit(_expression); - _queryParameters = ExpressionParameterVisitor.Visit(_expression); - ParameterValuesByName = _queryParameters.Values.ToDictionary(p => p.Name, p => p.Value); + _constantToParameterMap = ExpressionParameterVisitor.Visit(_expression); - Key = ExpressionKeyVisitor.Visit(_expression, _queryParameters); - Type = _expression.Type; + ParameterValuesByName = _constantToParameterMap.Values.ToDictionary(p => p.Name, p => p.Value); - ParameterValues = _queryParameters.Values; + Key = ExpressionKeyVisitor.Visit(_expression, _constantToParameterMap); + + Type = _expression.Type; // Note - re-linq handles return types via the GetOutputDataInfo method, and allows for SingleOrDefault here for the ChoiceResultOperator... ReturnType = NhLinqExpressionReturnType.Scalar; @@ -64,34 +61,38 @@ var requiredHqlParameters = new List<NamedParameterDescriptor>(); // TODO - can we cache any of this? - var queryModel = new QueryParser(new ExpressionTreeParser(MethodCallRegistry)).GetParsedQuery(_expression); + var queryModel = NhRelinqQueryParser.Parse(_expression); - _commandData = QueryModelVisitor.GenerateHqlQuery(queryModel, _queryParameters, requiredHqlParameters); + ExpressionToHqlTranslationResults = QueryModelVisitor.GenerateHqlQuery(queryModel, _constantToParameterMap, requiredHqlParameters); ParameterDescriptors = requiredHqlParameters.AsReadOnly(); - return _commandData.Statement.AstNode; + return ExpressionToHqlTranslationResults.Statement.AstNode; } + } - public string Key { get; private set; } + public static class NhRelinqQueryParser + { + public static readonly MethodCallExpressionNodeTypeRegistry MethodCallRegistry = + MethodCallExpressionNodeTypeRegistry.CreateDefault(); - public IList<NamedParameterDescriptor> ParameterDescriptors { get; private set; } + static NhRelinqQueryParser() + { + MethodCallRegistry.Register( + new[] + { + MethodCallExpressionNodeTypeRegistry.GetRegisterableMethodDefinition(ReflectionHelper.GetMethod(() => Queryable.Aggregate<object>(null, null))), + MethodCallExpressionNodeTypeRegistry.GetRegisterableMethodDefinition(ReflectionHelper.GetMethod(() => Queryable.Aggregate<object, object>(null, null, null))) + }, + typeof (AggregateExpressionNode)); + } - public ICollection<NamedParameter> ParameterValues { get; private set; } + public static QueryModel Parse(Expression expression) + { + return new QueryParser(new ExpressionTreeParser(MethodCallRegistry)).GetParsedQuery(expression); + } + } - public NhLinqExpressionReturnType ReturnType { get; private set; } - - public System.Type Type { get; private set; } - - public IDictionary<string, object> ParameterValuesByName { get; private set; } - - public void SetQueryPropertiesPriorToExecute(IQuery impl) - { - _commandData.SetResultTransformer(impl); - _commandData.AddAdditionalCriteria(impl); - } - } - public class NameUnNamedParameters : NhExpressionTreeVisitor { public static Expression Visit(Expression expression) Modified: trunk/nhibernate/src/NHibernate/Linq/NhQueryProvider.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Linq/NhQueryProvider.cs 2009-11-25 18:36:07 UTC (rev 4857) +++ trunk/nhibernate/src/NHibernate/Linq/NhQueryProvider.cs 2009-11-25 20:16:50 UTC (rev 4858) @@ -2,6 +2,7 @@ using System.Collections.Generic; using System.Linq; using System.Linq.Expressions; +using NHibernate.Impl; namespace NHibernate.Linq { @@ -21,6 +22,7 @@ var query = _session.CreateQuery(nhLinqExpression); SetParameters(query, nhLinqExpression.ParameterValuesByName); + SetResultTransformerAndAdditionalCriteria(query, nhLinqExpression.ParameterValuesByName); var results = query.List(); @@ -56,5 +58,19 @@ query.SetParameter(parameterName, parameters[parameterName]); } } + + public void SetResultTransformerAndAdditionalCriteria(IQuery query, IDictionary<string, object> parameters) + { + var queryImpl = (ExpressionQueryImpl) query; + + var nhExpression = (NhLinqExpression) queryImpl.QueryExpression; + + query.SetResultTransformer(nhExpression.ExpressionToHqlTranslationResults.ResultTransformer); + + foreach (var criteria in nhExpression.ExpressionToHqlTranslationResults.AdditionalCriteria) + { + criteria(query, parameters); + } + } } } \ No newline at end of file Added: trunk/nhibernate/src/NHibernate/Linq/ReWriters/RemoveUnnecessaryBodyOperators.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Linq/ReWriters/RemoveUnnecessaryBodyOperators.cs (rev 0) +++ trunk/nhibernate/src/NHibernate/Linq/ReWriters/RemoveUnnecessaryBodyOperators.cs 2009-11-25 20:16:50 UTC (rev 4858) @@ -0,0 +1,36 @@ +using System; +using System.Linq; +using Remotion.Data.Linq; +using Remotion.Data.Linq.Clauses; +using Remotion.Data.Linq.Clauses.ResultOperators; + +namespace NHibernate.Linq.ReWriters +{ + public class RemoveUnnecessaryBodyOperators : QueryModelVisitorBase + { + private RemoveUnnecessaryBodyOperators() + { + } + + public static void ReWrite(QueryModel queryModel) + { + var rewriter = new RemoveUnnecessaryBodyOperators(); + + rewriter.VisitQueryModel(queryModel); + } + + public override void VisitResultOperator(ResultOperatorBase resultOperator, QueryModel queryModel, int index) + { + if (resultOperator is CountResultOperator) + { + // For count operators, we can remove any order-by result operators + foreach (var orderby in queryModel.BodyClauses.Where(bc => bc is OrderByClause).ToList()) + { + queryModel.BodyClauses.Remove(orderby); + } + } + + base.VisitResultOperator(resultOperator, queryModel, index); + } + } +} \ No newline at end of file Modified: trunk/nhibernate/src/NHibernate/Linq/Visitors/ExpressionKeyVisitor.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Linq/Visitors/ExpressionKeyVisitor.cs 2009-11-25 18:36:07 UTC (rev 4857) +++ trunk/nhibernate/src/NHibernate/Linq/Visitors/ExpressionKeyVisitor.cs 2009-11-25 20:16:50 UTC (rev 4858) @@ -15,12 +15,12 @@ /// </summary> public class ExpressionKeyVisitor : ExpressionTreeVisitor { - private readonly IDictionary<ConstantExpression, NamedParameter> _parameters; + private readonly IDictionary<ConstantExpression, NamedParameter> _constantToParameterMap; readonly StringBuilder _string = new StringBuilder(); - private ExpressionKeyVisitor(IDictionary<ConstantExpression, NamedParameter> parameters) + private ExpressionKeyVisitor(IDictionary<ConstantExpression, NamedParameter> constantToParameterMap) { - _parameters = parameters; + _constantToParameterMap = constantToParameterMap; } public static string Visit(Expression expression, IDictionary<ConstantExpression, NamedParameter> parameters) @@ -76,7 +76,7 @@ { NamedParameter param; - if (_parameters.TryGetValue(expression, out param)) + if (_constantToParameterMap.TryGetValue(expression, out param)) { _string.Append(param.Name); } Modified: trunk/nhibernate/src/NHibernate/Linq/Visitors/HqlGeneratorExpressionTreeVisitor.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Linq/Visitors/HqlGeneratorExpressionTreeVisitor.cs 2009-11-25 18:36:07 UTC (rev 4857) +++ trunk/nhibernate/src/NHibernate/Linq/Visitors/HqlGeneratorExpressionTreeVisitor.cs 2009-11-25 20:16:50 UTC (rev 4858) @@ -353,7 +353,7 @@ protected HqlTreeNode VisitSubQueryExpression(SubQueryExpression expression) { - CommandData query = QueryModelVisitor.GenerateHqlQuery(expression.QueryModel, _parameters, _requiredHqlParameters); + ExpressionToHqlTranslationResults query = QueryModelVisitor.GenerateHqlQuery(expression.QueryModel, _parameters, _requiredHqlParameters); return query.Statement; } Modified: trunk/nhibernate/src/NHibernate/Linq/Visitors/QueryModelVisitor.cs =================================================================== --- trunk/nhibernate/src/NHibernate/Linq/Visitors/QueryModelVisitor.cs 2009-11-25 18:36:07 UTC (rev 4857) +++ trunk/nhibernate/src/NHibernate/Linq/Visitors/QueryModelVisitor.cs 2009-11-25 20:16:50 UTC (rev 4858) @@ -18,8 +18,11 @@ { public class QueryModelVisitor : QueryModelVisitorBase { - public static CommandData GenerateHqlQuery(QueryModel queryModel, IDictionary<ConstantExpression, NamedParameter> parameters, IList<NamedParameterDescriptor> requiredHqlParameters) + public static ExpressionToHqlTranslationResults GenerateHqlQuery(QueryModel queryModel, IDictionary<ConstantExpression, NamedParameter> parameters, IList<NamedParameterDescriptor> requiredHqlParameters) { + // Remove unnecessary body operators + RemoveUnnecessaryBodyOperators.ReWrite(queryModel); + // Merge aggregating result operators (distinct, count, sum etc) into the select clause MergeAggregatingResultsRewriter.ReWrite(queryModel); @@ -41,12 +44,12 @@ var visitor = new QueryModelVisitor(parameters, requiredHqlParameters); visitor.VisitQueryModel(queryModel); - return visitor.GetHqlCommand(); + return visitor.GetTranslation(); } private readonly HqlTreeBuilder _hqlTreeBuilder; - private readonly List<Action<IQuery>> _additionalCriteria = new List<Action<IQuery>>(); + private readonly List<Action<IQuery, IDictionary<string, object>>> _additionalCriteria = new List<Action<IQuery, IDictionary<string, object>>>(); private readonly List<LambdaExpression> _listTransformers = new List<LambdaExpression>(); private readonly List<LambdaExpression> _itemTransformers = new List<LambdaExpression>(); @@ -66,7 +69,8 @@ _requiredHqlParameters = requiredHqlParameters; _hqlTreeBuilder = new HqlTreeBuilder(); } - public CommandData GetHqlCommand() + + public ExpressionToHqlTranslationResults GetTranslation() { HqlSelectFrom selectFrom = _hqlTreeBuilder.SelectFrom(); @@ -104,10 +108,10 @@ query.AddChild(_orderByClause); } - return new CommandData(query, - _itemTransformers, - _listTransformers, - _additionalCriteria); + return new ExpressionToHqlTranslationResults(query, + _itemTransformers, + _listTransformers, + _additionalCriteria); } private HqlBooleanExpression MergeWhereClauses() @@ -297,14 +301,34 @@ private void ProcessTakeOperator(TakeResultOperator resultOperator) { - _additionalCriteria.Add(q => q.SetMaxResults(resultOperator.GetConstantCount())); + NamedParameter parameterName; + + // TODO - very similar to ProcessSkip, plus want to investigate the scenario in the "else" + // clause to see if it is valid + if (_parameters.TryGetValue(resultOperator.Count as ConstantExpression, out parameterName)) + { + _additionalCriteria.Add((q, p) => q.SetMaxResults((int) p[parameterName.Name])); + } + else + { + _additionalCriteria.Add((q, p) => q.SetMaxResults(resultOperator.GetConstantCount())); + } } private void ProcessSkipOperator(SkipResultOperator resultOperator) { - _additionalCriteria.Add(q => q.SetFirstResult(resultOperator.GetConstantCount())); - } + NamedParameter parameterName; + if (_parameters.TryGetValue(resultOperator.Count as ConstantExpression, out parameterName)) + { + _additionalCriteria.Add((q, p) => q.SetFirstResult((int)p[parameterName.Name])); + } + else + { + _additionalCriteria.Add((q, p) => q.SetFirstResult(resultOperator.GetConstantCount())); + } + } + private void ProcessNonAggregatingGroupBy(NonAggregatingGroupBy resultOperator, QueryModel model) { var tSource = model.SelectClause.Selector.Type; @@ -394,7 +418,7 @@ private void ProcessFirstOperator() { - _additionalCriteria.Add(q => q.SetMaxResults(1)); + _additionalCriteria.Add((q, p) => q.SetMaxResults(1)); } private static bool CanBeEvaluatedInHqlSelectStatement(Expression expression) Modified: trunk/nhibernate/src/NHibernate/NHibernate.csproj =================================================================== --- trunk/nhibernate/src/NHibernate/NHibernate.csproj 2009-11-25 18:36:07 UTC (rev 4857) +++ trunk/nhibernate/src/NHibernate/NHibernate.csproj 2009-11-25 20:16:50 UTC (rev 4858) @@ -586,6 +586,7 @@ <Compile Include="Linq\Expressions\NhMaxExpression.cs" /> <Compile Include="Linq\Expressions\NhMinExpression.cs" /> <Compile Include="Linq\Expressions\NhSumExpression.cs" /> + <Compile Include="Impl\ExpressionQueryImpl.cs" /> <Compile Include="Linq\Visitors\IHqlExpressionVisitor.cs" /> <Compile Include="Linq\GroupJoin\IsAggregatingResults.cs" /> <Compile Include="Linq\GroupJoin\GroupJoinAggregateDetectionVisitor.cs" /> @@ -602,6 +603,7 @@ <Compile Include="Linq\Functions\DateTimeGenerator.cs" /> <Compile Include="Linq\Functions\StringGenerator.cs" /> <Compile Include="Linq\Functions\QueryableGenerator.cs" /> + <Compile Include="Linq\ReWriters\RemoveUnnecessaryBodyOperators.cs" /> <Compile Include="Linq\Visitors\SwapQuerySourceVisitor.cs" /> <Compile Include="Linq\Visitors\EqualityHqlGenerator.cs" /> <Compile Include="Linq\Visitors\ExpressionParameterVisitor.cs" /> @@ -613,7 +615,7 @@ <Compile Include="Linq\GroupBy\AggregatingGroupByRewriter.cs" /> <Compile Include="Linq\GroupJoin\AggregatingGroupJoinRewriter.cs" /> <Compile Include="Linq\ResultOperators\ClientSideTransformOperator.cs" /> - <Compile Include="Linq\CommandData.cs" /> + <Compile Include="Linq\ExpressionToHqlTranslationResults.cs" /> <Compile Include="Linq\EnumerableHelper.cs" /> <Compile Include="Linq\GroupBy\GroupBySelectClauseRewriter.cs" /> <Compile Include="Linq\Visitors\GroupByKeySelectorVisitor.cs" /> Modified: trunk/nhibernate/src/NHibernate.Test/Linq/MethodCallTests.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Linq/MethodCallTests.cs 2009-11-25 18:36:07 UTC (rev 4857) +++ trunk/nhibernate/src/NHibernate.Test/Linq/MethodCallTests.cs 2009-11-25 20:16:50 UTC (rev 4858) @@ -4,10 +4,10 @@ namespace NHibernate.Test.Linq { [TestFixture] - [Ignore] public class MethodCallTests : LinqTestCase { [Test] + [Ignore("Waiting for re-linq support")] public void CanExecuteAny() { bool result = db.Users.Any(); @@ -15,7 +15,8 @@ } [Test] - public void CanExecuteAnyWithArguments() + [Ignore("Waiting for re-linq support")] + public void CanExecuteAnyWithArguments() { bool result = db.Users.Any(u => u.Name == "user-does-not-exist"); Assert.IsFalse(result); Modified: trunk/nhibernate/src/NHibernate.Test/Linq/MiscellaneousTextFixture.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Linq/MiscellaneousTextFixture.cs 2009-11-25 18:36:07 UTC (rev 4857) +++ trunk/nhibernate/src/NHibernate.Test/Linq/MiscellaneousTextFixture.cs 2009-11-25 20:16:50 UTC (rev 4858) @@ -1,5 +1,7 @@ using System; using System.Linq; +using System.Linq.Expressions; +using NHibernate.Test.Linq.Entities; using NUnit.Framework; namespace NHibernate.Test.Linq @@ -29,5 +31,71 @@ Console.WriteLine(count); } + + [Category("From NHUser list")] + [Test(Description = "Telerik grid example, http://www.telerik.com/community/forums/aspnet-mvc/grid/grid-and-nhibernate-linq.aspx")] + public void TelerikGridWhereClause() + { + Expression<Func<Customer, bool>> filter = c => c.ContactName.ToLower().StartsWith("a"); + IQueryable<Customer> value = db.Customers; + + var results = value.Where(filter).ToList(); + + Assert.IsFalse(results.Where(c => !c.ContactName.ToLower().StartsWith("a")).Any()); + } + + [Category("From NHUser list")] + [Test(Description = "Predicated count on a child list")] + public void PredicatedCountOnChildList() + { + var results = (from c in db.Customers + select new + { + c.ContactName, + Count = c.Orders.Count(o => o.Employee.EmployeeId == 4) + }).ToList(); + + Assert.AreEqual(91, results.Count()); + Assert.AreEqual(2, results.Where(c => c.ContactName == "Maria Anders").Single().Count); + Assert.AreEqual(4, results.Where(c => c.ContactName == "Thomas Hardy").Single().Count); + Assert.AreEqual(0, results.Where(c => c.ContactName == "Elizabeth Brown").Single().Count); + } + + [Category("From NHUser list")] + [Test(Description = "Reference an outer object in a predicate")] + public void ReferenceToOuter() + { + var results = from c in db.Customers + where + c.Orders.Any(o => o.ShippedTo == c.CompanyName) + select c; + + Assert.AreEqual(85, results.Count()); + } + + [Category("Paging")] + [Test(Description = "This sample uses a where clause and the Skip and Take operators to select " + + "the second, third and fourth pages of products")] + public void TriplePageSelection() + { + IQueryable<Product> q = ( + from p in db.Products + where p.ProductId > 1 + orderby p.ProductId + select p + ); + + IQueryable<Product> page2 = q.Skip(5).Take(5); + IQueryable<Product> page3 = q.Skip(10).Take(5); + IQueryable<Product> page4 = q.Skip(15).Take(5); + + var firstResultOnPage2 = page2.First(); + var firstResultOnPage3 = page3.First(); + var firstResultOnPage4 = page4.First(); + + Assert.AreNotEqual(firstResultOnPage2.ProductId, firstResultOnPage3.ProductId); + Assert.AreNotEqual(firstResultOnPage3.ProductId, firstResultOnPage4.ProductId); + Assert.AreNotEqual(firstResultOnPage2.ProductId, firstResultOnPage4.ProductId); + } } } Modified: trunk/nhibernate/src/NHibernate.Test/Linq/ParameterisedQueries.cs =================================================================== --- trunk/nhibernate/src/NHibernate.Test/Linq/ParameterisedQueries.cs 2009-11-25 18:36:07 UTC (rev 4857) +++ trunk/nhibernate/src/NHibernate.Test/Linq/ParameterisedQueries.cs 2009-11-25 20:16:50 UTC (rev 4858) @@ -48,10 +48,10 @@ var nhNewYork = new NhLinqExpression(newYork.Body); Assert.AreEqual(nhLondon.Key, nhNewYork.Key); - Assert.AreEqual(1, nhLondon.ParameterValues.Count); - Assert.AreEqual(1, nhNewYork.ParameterValues.Count); - Assert.AreEqual("London", nhLondon.ParameterValues.First().Value); - Assert.AreEqual("New York", nhNewYork.ParameterValues.First().Value); + Assert.AreEqual(1, nhLondon.ParameterValuesByName.Count); + Assert.AreEqual(1, nhNewYork.ParameterValuesByName.Count); + Assert.AreEqual("London", nhLondon.ParameterValuesByName.First().Value); + Assert.AreEqual("New York", nhNewYork.ParameterValuesByName.First().Value); } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |