Linq: 2 join bug
От: ili Россия  
Дата: 21.02.11 12:26
Оценка:
Вобщемс бяда какая-то с 2 джоинами (ломается на втором джоине, если один из джоинов убрать — работает):

        public class Entity
        {
            public Int32 Id { get; set; }
        }

        public abstract class Master
        {
            [PrimaryKey]
            public abstract int          MasterId {get; set;}
            public abstract List<Detail> Details  {get; set;}
            public abstract string       Name     {get; set;}
        }

        [MapField("Master1Id", "Master1.MasterId")]
        [MapField("Master2Id", "Master2.MasterId")]
        public class DetailTwoHead : Entity
        {
            public Master Master1 { get; set; }
            public Master Master2 { get; set; }

        }

        [Test]
        public void TwoJoinCase()
        {
            using (var db = GetDbManager())
            {
                var visitsFiltered = from detail in db.GetTable<DetailTwoHead>()
                                     join master1 in db.GetTable<Master>() on detail.Master1.MasterId equals master1.MasterId
                                     join master2 in db.GetTable<Master>() on detail.Master1.MasterId equals master2.MasterId
                                     select detail;
                var res = visitsFiltered.ToList();
            }
        }


ломается так:

BLToolkit.Data.Linq.LinqException : '<>h__TransparentIdentifier1.detail.Master2.MasterId' cannot be converted to SQL.
в BLToolkit.Data.Linq.ExpressionParserOld`1.ParseExpression(LambdaInfo lambda, Expression expression, QuerySource[] queries) в ExpressionParser.QueryBuilder.cs: line 1567
в BLToolkit.Data.Linq.ExpressionParserOld`1.ParseJoin(Expression inner, LambdaInfo outerKeySelector, LambdaInfo innerKeySelector, LambdaInfo resultSelector, QuerySource outerSource) в ExpressionParser.Parsing.cs: line 1060
в BLToolkit.Data.Linq.ExpressionParserOld`1.<>c__DisplayClass186.<ParseSequenceInternal>b__114(Expression i, LambdaInfo l2, LambdaInfo l3, LambdaInfo l4) в ExpressionParser.Parsing.cs: line 455
в BLToolkit.Linq.ExpressionHelper.IsQueryableMethod(MethodCallExpression pi, String methodName, Action`1 seq, Action`4 parms) в ExpressionHelper.cs: line 241
в BLToolkit.Data.Linq.ExpressionParserOld`1.<>c__DisplayClass186.<ParseSequenceInternal>b__112(MethodCallExpression pi) в ExpressionParser.Parsing.cs: line 455
в BLToolkit.Linq.ExpressionHelper.Match(T expr, Func`2[] matches) в ExpressionHelper.cs: line 390
в BLToolkit.Data.Linq.ExpressionParserOld`1.ParseSequenceInternal(Expression info) в ExpressionParser.Parsing.cs: line 380
в BLToolkit.Data.Linq.ExpressionParserOld`1.ParseSequence(Expression info) в ExpressionParser.Parsing.cs: line 247
в BLToolkit.Data.Linq.ExpressionParserOld`1.<Parse>b__ed(Expression pi) в ExpressionParser.Parsing.cs: line 111
в BLToolkit.Linq.ExpressionHelper.Match(T expr, Func`2[] matches) в ExpressionHelper.cs: line 390
в BLToolkit.Data.Linq.ExpressionParserOld`1.Parse(String contextID, MappingSchema mappingSchema, Func`1 createSqlProvider, Expression expression, ParameterExpression[] compiledParameters) в ExpressionParser.Parsing.cs: line 86
в BLToolkit.Data.Linq.Query`1.GetQuery(IDataContextInfo dataContextInfo, Expression expr) в Query.cs: line 131
в BLToolkit.Data.Linq.Table`1.GetQuery(Expression expression, Boolean cache) в TableT.cs: line 106
в BLToolkit.Data.Linq.Table`1.Execute(IDataContextInfo dataContextInfo, Expression expression) в TableT.cs: line 98
в BLToolkit.Data.Linq.Table`1.System.Collections.Generic.IEnumerable<T>.GetEnumerator() в TableT.cs: line 193
в System.Collections.Generic.List`1..ctor(IEnumerable`1 collection)
в System.Linq.Enumerable.ToList(IEnumerable`1 source)

Re: Linq: 2 join bug
От: IT Россия linq2db.com
Дата: 21.02.11 16:48
Оценка:
Здравствуйте, ili, Вы писали:

ili>Вобщемс бяда какая-то с 2 джоинами (ломается на втором джоине, если один из джоинов убрать — работает):


Беда. Я сейчас над этим усиленно работаю.
Если нам не помогут, то мы тоже никого не пощадим.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.