Page 1 of 1

Compile Query with object input

Posted: Thu 25 Nov 2010 06:40
by mepolsen
I'm getting an InvalidOperationException was unhandled by user code with a compiled query, 'Could not format node 'ClientParameter' for execution as SQL.'. The iiner exception is null. The exception detail is the following:

System.InvalidOperationException was unhandled by user code
Message="Could not format node 'ClientParameter' for execution as SQL."
Source="Devart.Data.Linq"
StackTrace:
at Devart.Data.Linq.Provider.Query.SqlFormatter.Visitor.Visit(SqlNode node)
at Devart.Data.Linq.Provider.Query.SqlFormatter.Visitor.VisitMember(g m)
at Devart.Data.Linq.Provider.Query.SqlVisitor.Visit(SqlNode node)
at Devart.Data.Linq.Provider.Query.SqlFormatter.Visitor.Visit(SqlNode node)
at Devart.Data.Linq.Provider.Query.SqlFormatter.Visitor.VisitWithParens(SqlNode node, SqlNode outer)
at Devart.Data.Linq.Provider.Query.SqlFormatter.Visitor.VisitBinaryOperator(ab bo)
at Devart.Data.Linq.Provider.Query.SqlVisitor.Visit(SqlNode node)
at Devart.Data.Linq.Provider.Query.SqlFormatter.Visitor.Visit(SqlNode node)
at Devart.Data.Linq.Provider.Query.SqlFormatter.Visitor.VisitSelect(SqlSelect ss)
at Devart.Data.Linq.Provider.Query.SqlVisitor.VisitAlias(d a)
at Devart.Data.Linq.Provider.Query.SqlVisitor.Visit(SqlNode node)
at Devart.Data.Linq.Provider.Query.SqlFormatter.Visitor.Visit(SqlNode node)
at Devart.Data.Linq.Provider.Query.SqlVisitor.VisitIncludeScope(aj node)
at Devart.Data.Linq.Provider.Query.SqlFormatter.Visitor.VisitIncludeScope(aj node)
at Devart.Data.Linq.Provider.Query.SqlVisitor.Visit(SqlNode node)
at Devart.Data.Linq.Provider.Query.SqlFormatter.Visitor.Visit(SqlNode node)
at Devart.Data.Linq.Provider.Query.SqlFormatter.Format(SqlNode node, CommandType& commandType)
at Devart.Data.Linq.Provider.DataProvider.BuildQuery(ResultShape resultShape, Type resultType, SqlNode node, IList`1 externalParameterAccessors)
at Devart.Data.Linq.Provider.DataProvider.BuildQuery(Expression query)
at Devart.Data.Linq.Provider.DataProvider.Devart.Data.Linq.Provider.IProvider.Compile(Expression query)
at Devart.Data.Linq.CompiledQuery.a(IProvider A_0)
at Devart.Data.Linq.CompiledQuery.a(DataContext A_0, Object[] A_1)
at Devart.Data.Linq.CompiledQuery.Invoke[a,b,c](a A_0, b A_1)
at SpearPanelController.MainForm.CorrectionFactorBackgroundWorkerDoWork(Object sender, DoWorkEventArgs e) in C:\Documents and Settings\mpolsen\My Documents\Visual Studio 2008\Projects\SpearPanelController\src\Main\SpearPanelController\MainForm.cs:line 1596
at System.ComponentModel.BackgroundWorker.OnDoWork(DoWorkEventArgs e)
at System.ComponentModel.BackgroundWorker.WorkerThreadStart(Object argument)
InnerException:

I use a class (object) as input to the query since I have many conditions on the Where part of my query and Func only supports 4 arguments in .Net 3.5.

public static Func>
AttenuationStateFrequencies = CompiledQuery.Compile((CalibrationDataContext db, AttenuationStateContext ctx) =>
from it in db.AttenuationStatePhases
where it.Tile.X == ctx.TileX
select new CalibrationMeasurement { F15 = it.F15, F20 = it.F20 });

The argument is just a class with set/get properties. Is the CompileQuery method incapable of handling this type of input or is there a workaround?

Posted: Thu 25 Nov 2010 12:54
by StanislavK
We will consider implementing support for passing custom classes and structures as compiled queries parameters. We will inform you about the results of our investigation here.

As a workaround, you can use an object array instead. In this case, it is necessary to explicitly cast items of this array to their actual types:

Code: Select all

public static Func>
  GetDept = Devart.Data.Linq.CompiledQuery.Compile((ScottDataContext dc, object[] parameters) =>
      from d in dc.Depts
      where d.Deptno == (int)parameters[0] &&
        d.Dname == (string)parameters[1] &&
        d.Loc == (string)parameters[2]
      select d
    );

var query = GetDept(dc, new object[3] { 10, "ACCOUNTING", "NEW YORK" }).ToList();
The Dept table used in the sample is defined as

Code: Select all

CREATE TABLE DEPT (
  DEPTNO NUMBER(4) CONSTRAINT PK_DEPT PRIMARY KEY,
  DNAME VARCHAR2(14) ,
  LOC VARCHAR2(13)
);

Posted: Thu 25 Nov 2010 17:20
by mepolsen
So far this appears to be working. I would be nice to have support for custom classes. Please let me know if this feature would be implemented soon.

Thanks

Posted: Fri 26 Nov 2010 11:01
by StanislavK
We will inform you as soon as this feature is implemented. However, at the moment we cannot provide any timeframe for this.

Posted: Tue 30 Nov 2010 17:51
by StanislavK
We have released dotConnect for MySQL 6 which includes support for custom type parameters in compiled LINQ queries. The new build can be downloaded from
http://www.devart.com/dotconnect/mysql/download.html
(the trial version) or from Registered Users' Area (for users with active subscription only):
http://secure.devart.com/

For the detailed information on fixes and improvements available in dotConnect for MySQL 6, please refer to
http://www.devart.com/forums/viewtopic.php?t=19623