Skip to content

?? Operator in Column Expression of Join wont work #329

@GoogleCodeExporter

Description

@GoogleCodeExporter
What steps will reproduce the problem?
1. make query like this:
var query = from order in db.Order                     //can be null
            join customer in db.Customer on (order.CustomerID??0)equals customer.CustomerID
            select new MyJoinedObject{ order=order, customer=customer };

What is the expected output?
data of Joined Tables

What do you see instead?
Exception: Error.BadArgument("S0701: No way to find left table for Join");
in DbLinq.Data.Linq.Sugar.Implementation.ExpressionDispatcher.AnalyzeJoin

What version of the product are you using? On what operating system?
rev 1411 on 7x64 .Net4, also happens on previous Version 0.20.1

Please provide any additional information below.
DB Looks like this:
                          +---------------+
+-------------------+     |Orders         |
|Customer           |     +---------------+
+-------------------+     |int  #OrderID  |
|int    #CustomerID | --> |int? CustomerID|
|string CustomerName|     +---------------+
+-------------------+

Fixed it like this: (not good but works (for me))
private Expression AnalyzeJoin(IList<Expression> parameters, TableJoinType 
joinType, BuilderContext builderContext)
    {
      if (parameters.Count == 5)
      {
        var leftExpression = Analyze(parameters[0], builderContext);
        var rightTable = Analyze(parameters[1], builderContext) as TableExpression;
        if (rightTable == null)
          throw Error.BadArgument("S0536: Expected a TableExpression for Join");
        var leftJoin = Analyze(parameters[2], leftExpression, builderContext);
        var rightJoin = Analyze(parameters[3], rightTable, builderContext);
        // from here, we have two options to join:
        // 1. left and right are tables, we can use generic expressions (most common)
        // 2. left is something else (a meta table)
        var leftTable = leftExpression as TableExpression;
        if (leftTable == null)
        {
          TableExpression table;
          if (leftJoin.NodeType == ExpressionType.Coalesce)
            table = ((ColumnExpression)((BinaryExpression)leftJoin).Left).Table;
          else if (leftJoin.NodeType == ((ExpressionType)CustomExpressionType.Column))
            table = ((ColumnExpression)leftJoin).Table;
          else
            throw Error.BadArgument("S0701: No way to find left table for Join");
          leftTable= table;
        }
        rightTable.Join(joinType, leftTable, Expression.Equal(leftJoin, rightJoin),
                        string.Format("join{0}", builderContext.EnumerateAllTables().Count()));
        // last part is lambda, with two tables as parameters
        var metaTableDefinitionBuilderContext = builderContext.Clone();
        metaTableDefinitionBuilderContext.ExpectMetaTableDefinition = true;
        var expression = Analyze(parameters[4], new[] { leftExpression, rightTable }, metaTableDefinitionBuilderContext);
        return expression;
      }
      throw Error.BadArgument("S0530: Don't know how to handle GroupJoin() with {0} parameters", parameters.Count);
    }

Original issue reported on code.google.com by [email protected] on 23 Feb 2012 at 12:28

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions