Doesn't work with XtraGrid server mode

Posts   
1  /  2
 
    
mihies avatar
mihies
User
Posts: 800
Joined: 29-Jan-2006
# Posted on: 13-Mar-2008 09:44:49   

FYI

I just tested 8.1 RC (server mode) against LINQ to LLBLGen Pro beta and it doesn't work - no exceptions, just the data isn't fetched.

While 8.1 RC works with LINQ to SQL.

DvK
User
Posts: 318
Joined: 22-Mar-2006
# Posted on: 13-Mar-2008 10:20:44   

Ok, that is a pitty ! Any ideas why not ?

Otis avatar
Otis
LLBLGen Pro Team
Posts: 39613
Joined: 17-Aug-2003
# Posted on: 13-Mar-2008 10:37:21   

Could you enable tracing and see if there are any queries generated ?

(edit). I have never used their xtragrid server stuff, I'll check the RC out if I can access it through our subscription.

You can enable linq tracing as well, check the app.config file in the unittests project. It will produce a lot of output but it will show if there's any tree evaluation.

Frans Bouma | Lead developer LLBLGen Pro
mihies avatar
mihies
User
Posts: 800
Joined: 29-Jan-2006
# Posted on: 13-Mar-2008 12:03:53   

Actually there is an exception (I didn't catch it before because I've turned out caching external exceptions flushed )

The good news is that it doesn't look like LINQ to LLLBLGenPro bug - instead LinqServerModeSource is trying to select ObjectID column from database for some reason:

The property 'ObjectID' isn't mapped to a field or database construct of entity type 'CustomersEntity'. Did you mean to call an extension method instead? ('Count' vs. 'Count()') ?

Not sure why the same provider works with LINQ to SQL - perhaps L2S is ignoring invalid columns?

Otis avatar
Otis
LLBLGen Pro Team
Posts: 39613
Joined: 17-Aug-2003
# Posted on: 13-Mar-2008 12:23:29   

AH simple_smile

This is what I expected: they use reflection and simply add a filter on every property. You get the same exception when you do this: var q = from c in metaData.Customer select c.Orders.Count;

Here, 'Count' is the property of the 'Orders' collection, not the extension method Count(). So the provider has no idea what to do with it, as it's not mapped onto a method or a db field or anything, so it gives up.

Entity types have 'ObjectID' as a property (and other properties as well). These properties are all marked as 'Browsable(false)', with the browsable attribute.

Two things can be done: 1) I can ignore the properties, but that's not always easy: in the above query: what should the query do? So it's not always ignorable and KEEP the query as-is. or 2) They can filter out properties which are marked as Browsable(false). Or use ITypedList if possible, as that's going to give you the right results.

Linq to Sql doesn't have this as their entity classes don't have properties which aren't mapped onto a db field, and their entityset properties are mapped onto methods (e.g. 'Count' is mapped onto Count()) I think you can get the same kind of error from linq to sql if you add a custom property in code which is returning another property in the entity.

Frans Bouma | Lead developer LLBLGen Pro
mihies avatar
mihies
User
Posts: 800
Joined: 29-Jan-2006
# Posted on: 13-Mar-2008 15:17:12   

Here is some more info:

If I set LinqServerModeProvider.KeyExpression=PROPERTY_THAT_DOESNT_EXIST (i.e. ObjectID, CustomerID) the LinqServerModeProvider tries always to pass ObjectID which doesn't work. However, if I set KeyExpression to a property that does exist (CustomerId) I get Argument null exception that might be caused by LINQ to LLBLGenPro.

Here is stack trace:

    SD.LLBLGen.Pro.LinqSupportClasses.NET35.dll!SD.LLBLGen.Pro.LinqSupportClasses.ExpressionHandlers. QueryExpressionBuilder.HandleProjectionExpression(SD.LLBLGen.Pro.LinqSupportClasses. ExpressionClasses.ProjectionExpression expressionToHandle = {SD.LLBLGen.Pro.LinqSupportClasses.ExpressionClasses.ProjectionExpression}) Line 1923 + 0x15 bytes   C#
    SD.LLBLGen.Pro.LinqSupportClasses.NET35.dll!SD.LLBLGen.Pro.LinqSupportClasses.ExpressionHandlers. GenericExpressionHandler.HandleExpression(System.Linq.Expressions.Expression expressionToHandle = {SD.LLBLGen.Pro.LinqSupportClasses.ExpressionClasses.ProjectionExpression}) Line 203 + 0x2c bytes   C#
>   SD.LLBLGen.Pro.LinqSupportClasses.NET35.dll!SD.LLBLGen.Pro.LinqSupportClasses.ExpressionHandlers. QueryExpressionBuilder.HandleExpression(System.Linq.Expressions.Expression expressionToHandle = {SD.LLBLGen.Pro.LinqSupportClasses.ExpressionClasses.ProjectionExpression}) Line 117 + 0x9 bytes  C#
    SD.LLBLGen.Pro.LinqSupportClasses.NET35.dll!SD.LLBLGen.Pro.LinqSupportClasses.ExpressionHandlers. QueryExpressionBuilder.HandleGroupByExpression(SD.LLBLGen.Pro.LinqSupportClasses. ExpressionClasses.GroupByExpression expressionToHandle = {SD.LLBLGen.Pro.LinqSupportClasses.ExpressionClasses.GroupByExpression}) Line 861 + 0x47 bytes C#
    SD.LLBLGen.Pro.LinqSupportClasses.NET35.dll!SD.LLBLGen.Pro.LinqSupportClasses.ExpressionHandlers .GenericExpressionHandler.HandleExpression(System.Linq.Expressions.Expression expressionToHandle = {SD.LLBLGen.Pro.LinqSupportClasses.ExpressionClasses.GroupByExpression}) Line 167 + 0x2c bytes  C#
    SD.LLBLGen.Pro.LinqSupportClasses.NET35.dll!SD.LLBLGen.Pro.LinqSupportClasses.ExpressionHandlers. QueryExpressionBuilder.HandleExpression(System.Linq.Expressions.Expression expressionToHandle = {SD.LLBLGen.Pro.LinqSupportClasses.ExpressionClasses.GroupByExpression}) Line 117 + 0x9 bytes C#
    SD.LLBLGen.Pro.LinqSupportClasses.NET35.dll!SD.LLBLGen.Pro.LinqSupportClasses.ExpressionHandlers. GenericExpressionHandler.HandleSelectExpression(SD.LLBLGen.Pro.LinqSupportClasses. ExpressionClasses.SelectExpression expressionToHandle = {SD.LLBLGen.Pro.LinqSupportClasses.ExpressionClasses.SelectExpression}, SD.LLBLGen.Pro.LinqSupportClasses.ExpressionClasses.SelectExpression newInstance = {SD.LLBLGen.Pro.LinqSupportClasses.ExpressionClasses.SelectExpression}) Line 798 + 0x19 bytes   C#
    SD.LLBLGen.Pro.LinqSupportClasses.NET35.dll!SD.LLBLGen.Pro.LinqSupportClasses.ExpressionHandlers. GenericExpressionHandler.HandleSelectExpression(SD.LLBLGen.Pro.LinqSupportClasses. ExpressionClasses.SelectExpression expressionToHandle = {SD.LLBLGen.Pro.LinqSupportClasses.ExpressionClasses.SelectExpression}) Line 779 + 0xc bytes   C#
    SD.LLBLGen.Pro.LinqSupportClasses.NET35.dll!SD.LLBLGen.Pro.LinqSupportClasses.ExpressionHandlers. QueryExpressionBuilder.HandleSelectExpression(SD.LLBLGen.Pro.LinqSupportClasses. ExpressionClasses.SelectExpression expressionToHandle = {SD.LLBLGen.Pro.LinqSupportClasses.ExpressionClasses.SelectExpression}) Line 2248 + 0xb bytes    C#
    SD.LLBLGen.Pro.LinqSupportClasses.NET35.dll!SD.LLBLGen.Pro.LinqSupportClasses.ExpressionHandlers. GenericExpressionHandler.HandleExpression(System.Linq.Expressions.Expression expressionToHandle = {SD.LLBLGen.Pro.LinqSupportClasses.ExpressionClasses.SelectExpression}) Line 209 + 0x2c bytes   C#
    SD.LLBLGen.Pro.LinqSupportClasses.NET35.dll!SD.LLBLGen.Pro.LinqSupportClasses.ExpressionHandlers. QueryExpressionBuilder.HandleExpression(System.Linq.Expressions.Expression expressionToHandle = {SD.LLBLGen.Pro.LinqSupportClasses.ExpressionClasses.SelectExpression}) Line 117 + 0x9 bytes  C#
    SD.LLBLGen.Pro.LinqSupportClasses.NET35.dll!SD.LLBLGen.Pro.LinqSupportClasses.LLBLGenProProviderBase. HandleExpressionTree(System.Linq.Expressions.Expression expression = {System.Linq.Expressions.MethodCallExpression}) Line 146 + 0xa bytes C#
    SD.LLBLGen.Pro.LinqSupportClasses.NET35.dll!SD.LLBLGen.Pro.LinqSupportClasses.LLBLGenProProviderBase. Execute(System.Linq.Expressions.Expression expression = {System.Linq.Expressions.MethodCallExpression}) Line 91 + 0x9 bytes   C#
    SD.LLBLGen.Pro.LinqSupportClasses.NET35.dll!SD.LLBLGen.Pro.LinqSupportClasses.LLBLGenProProviderBase. System.Linq.IQueryProvider.Execute(System.Linq.Expressions.Expression expression = {System.Linq.Expressions.MethodCallExpression}) Line 653 + 0x9 bytes   C#
    SD.LLBLGen.Pro.LinqSupportClasses.NET35.dll!SD.LLBLGen.Pro.LinqSupportClasses. LLBLGenProQuery<object[]>.Execute() Line 84 + 0xc bytes  C#
    SD.LLBLGen.Pro.LinqSupportClasses.NET35.dll!SD.LLBLGen.Pro.LinqSupportClasses. LLBLGenProQuery<object[]>. System.Collections.IEnumerable.GetEnumerator() Line 148 + 0x8 bytes   C#
Otis avatar
Otis
LLBLGen Pro Team
Posts: 39613
Joined: 17-Aug-2003
# Posted on: 13-Mar-2008 16:06:40   

mihies wrote:

Here is some more info:

If I set LinqServerModeProvider.KeyExpression=PROPERTY_THAT_DOESNT_EXIST (i.e. ObjectID, CustomerID) the LinqServerModeProvider tries always to pass ObjectID which doesn't work. However, if I set KeyExpression to a property that does exist (CustomerId) I get Argument null exception that might be caused by LINQ to LLBLGenPro.

That's because the ProjectionDefinition inside the ProjectionExpression is null, which means the projection couldn't be handled. I have no idea why without the query.

I don't understand why they will pass ObjectID to the query...

This is impossible to track down without a repro case, and where I can break into the code and check what the expression looks like which they're creating. I'll see if I can get their RC stuff and create some sample project.

Frans Bouma | Lead developer LLBLGen Pro
mihies avatar
mihies
User
Posts: 800
Joined: 29-Jan-2006
# Posted on: 13-Mar-2008 16:13:32   

Right. In the meantime I am keeping them busy on this issue as well simple_smile .

Otis avatar
Otis
LLBLGen Pro Team
Posts: 39613
Joined: 17-Aug-2003
# Posted on: 13-Mar-2008 16:24:05   

mihies wrote:

Right. In the meantime I am keeping them busy on this issue as well simple_smile .

Do you have an URL for me on their forums about this issue so I can post there if necessary? simple_smile

Thanks for the hard work in this btw! simple_smile

Frans Bouma | Lead developer LLBLGen Pro
mihies avatar
mihies
User
Posts: 800
Joined: 29-Jan-2006
# Posted on: 13-Mar-2008 16:49:52   

Hi Frans,

Here is repro case suggested by DX folk:

var stdGouped = from c in ctx.Customers.ToArray() group c by 0 into cc select cc.Count(); var stdResult = stdGouped.ToArray();

var bugGouped = from c in ctx.Customers group c by 0 into cc select cc.Count(); var bugResult = bugGouped.ToArray(); 

The later yields exception Object reference not set to an instance of an object.

About the first problem: the ObjectID is used always (at least I think so now) when one sets KeyExpression to an invalid property (CustomerID instead of CustomerId in my case).

Otis avatar
Otis
LLBLGen Pro Team
Posts: 39613
Joined: 17-Aug-2003
# Posted on: 13-Mar-2008 17:22:04   

mihies wrote:

Hi Frans,

Here is repro case suggested by DX folk:

var stdGouped = from c in ctx.Customers.ToArray() group c by 0 into cc select cc.Count(); var stdResult = stdGouped.ToArray();

var bugGouped = from c in ctx.Customers group c by 0 into cc select cc.Count(); var bugResult = bugGouped.ToArray(); 

The later yields exception Object reference not set to an instance of an object.

I see, but what does the query mean? When I run it through linq to sql I get a bogus query: SELECT COUNT(*) AS [value] FROM ( SELECT @p0 AS [value] FROM [dbo].[Customers] AS [t0] ) AS [t1] GROUP BY [t1].[value] -- @p0: Input Int (Size = 0; Prec = 0; Scale = 0) [0]

This is a very complicated way of doing: (from c in ctx.Customers select c).Count();

or better: IQueryable variable.Count()

The main problem is that the value to group on isn't from INSIDE the query, yet it's supplied as a parameter, i.e. the '0' value.

This isn't supported by LLBLGen Pro, because it makes no sense: you specified a PK field, so it should group on that field instead of a constant. (however grouping is redundant here, it can just do a count).

I've gone to great lengths implementing group by, on multiple fields (with anonymous typed objects), however this scenario is new to me (and as it has an easy alternative, I don't see why one would implement it like this).

About the first problem: the ObjectID is used always (at least I think so now) when one sets KeyExpression to an invalid property (CustomerID instead of CustomerId in my case).

Ok, so that's their problem then. I still don't see why they would opt for that property, but perhaps that's a glitch in their code, not sure.

Frans Bouma | Lead developer LLBLGen Pro
mihies avatar
mihies
User
Posts: 800
Joined: 29-Jan-2006
# Posted on: 13-Mar-2008 17:24:06   

Otis wrote:

mihies wrote:

Right. In the meantime I am keeping them busy on this issue as well simple_smile .

Do you have an URL for me on their forums about this issue so I can post there if necessary? simple_smile

If you are a customer use Support Center http://www.devexpress.com/support/center/ or alternatively you can send an e-mail to support@devexpress.com. (you can also reference issue i posted http://www.devexpress.com/support/center/p/B92896.aspx). Forums are mostly peer to peer.

Otis avatar
Otis
LLBLGen Pro Team
Posts: 39613
Joined: 17-Aug-2003
# Posted on: 13-Mar-2008 17:29:18   

mihies wrote:

Otis wrote:

mihies wrote:

Right. In the meantime I am keeping them busy on this issue as well simple_smile .

Do you have an URL for me on their forums about this issue so I can post there if necessary? simple_smile

If you are a customer use Support Center http://www.devexpress.com/support/center/ or alternatively you can send an e-mail to support@devexpress.com. (you can also reference issue i posted http://www.devexpress.com/support/center/p/B92896.aspx). Forums are mostly peer to peer.

Hmm...

I'll send them an email referring this thread and your bugreport. I definitely want to know what the reason is for this weird query.

Frans Bouma | Lead developer LLBLGen Pro
Otis avatar
Otis
LLBLGen Pro Team
Posts: 39613
Joined: 17-Aug-2003
# Posted on: 13-Mar-2008 17:40:18   

http://www.devexpress.com/Support/Center/p/Q98554.aspx

I've to say, if they don't come with a good explanation, I won't build this in, as it's a bogus query and I've to build in a special case code path into the provider (grouping on constants). I'm not sure if that's easy, as the grouping on the constant requires a subquery which gets a constant inserted into the projection, something that's not doable without a DBFunctionCall in llblgen pro (because, why should you). It's doable in the projection using in-memory code (we have that in place) but grouping takes place inside the db, so the constant to group on has to be passed to the db.

I get the feeling they use this query to work around a limitation in xpo

Frans Bouma | Lead developer LLBLGen Pro
DvK
User
Posts: 318
Joined: 22-Mar-2006
# Posted on: 13-Mar-2008 20:32:44   
Otis avatar
Otis
LLBLGen Pro Team
Posts: 39613
Joined: 17-Aug-2003
# Posted on: 13-Mar-2008 20:40:40   

DvK wrote:

http://www.devexpress.com/Support/Center/p/Q98573.aspx

Heh thanks for the support, Danny simple_smile

I'm sure it's solvable, after all the query is pretty weird, so I'm sure it's fixable into a more appropriate query.

Frans Bouma | Lead developer LLBLGen Pro
DvK
User
Posts: 318
Joined: 22-Mar-2006
# Posted on: 13-Mar-2008 20:46:22   

I have to say : they're always willing and pretty responsive at DevExpress to issues. Not as responsive as at SD sunglasses ....but they do at least their best !

Let's keep them busy....smile

Otis avatar
Otis
LLBLGen Pro Team
Posts: 39613
Joined: 17-Aug-2003
# Posted on: 14-Mar-2008 11:51:48   

This query: var stdGouped = from c in ctx.Customers.ToArray() group c by 0 into cc select cc.Count(); var stdResult = stdGouped.ToArray();

is even more weird, as it results in a simple return of the whole table, and which is then grouped in-memory. The 'ToArray()' call inside the query causes this.

This query should be read as: var q = from c in <enumerable> group c by 0 into cc select cc.Count();

and it then first executes the enumerable, which is a linq query to the database: ctx.Customers.ToArray();

( I check this in the debugger, the expression tree is simply metaData.Customers)

Frans Bouma | Lead developer LLBLGen Pro
Otis avatar
Otis
LLBLGen Pro Team
Posts: 39613
Joined: 17-Aug-2003
# Posted on: 14-Mar-2008 12:16:18   

DevExpress has responded, and I'm not a bit wiser... disappointed

I just thought of another thing: paging. They likely will use Skip/Take for paging. However, skip for paging isn't supported by us, nor by some competitors of ours: we all use an extension method for paging. Linq to Sql often dies with using skip/take as it requires other elements to be in the query to work with skip/take (like order by, you can't always use joins etc. etc.).

Frans Bouma | Lead developer LLBLGen Pro
Otis avatar
Otis
LLBLGen Pro Team
Posts: 39613
Joined: 17-Aug-2003
# Posted on: 14-Mar-2008 15:22:29   

Ok, I managed to implement grouping on constants. It required a different, special case codepath inside the groupby handler, but as this is an edge case, I think it's ok.


LinqMetaData metaData = new LinqMetaData(adapter);

var q = from c in metaData.Customer
        where c.Country=="USA"
        group c by 0 into cc
        select cc.Count();

foreach(var v in q)
{
    Assert.AreEqual(13, v);
}

Not sure if this works with the rest of the elements DevExpress tries to cram into the query, but at least grouping on constants works. THough I still would like to see them change this requirement, as it's not really helpful to them either: requiring edge-case queries to do simple things is IMHO not what they should try to achieve.

(attached). Could someone with xtragrid 8.1 rc try this one? SOmething else fails, 22 tests fail, looking into it.

(edit) oh how embarrasing flushed simple_smile I changed the internals into publics in LinqUtils, but this made the methodinfo grabbing code for a method inside LinqUtils not working anymore.

Frans Bouma | Lead developer LLBLGen Pro
mihies avatar
mihies
User
Posts: 800
Joined: 29-Jan-2006
# Posted on: 14-Mar-2008 15:55:50   

Yup, there is still an exception out there.

Otis avatar
Otis
LLBLGen Pro Team
Posts: 39613
Joined: 17-Aug-2003
# Posted on: 14-Mar-2008 16:02:59   

Ok fixed.

I've also changed the tracing. This will help with the query they execute. In the config file of your app: <system.diagnostics> <switches> <add name="SqlServerDQE" value="4" /> <add name="ORMGeneral" value="0" /> <add name="ORMStateManagement" value="0" /> <add name="ORMPersistenceExecution" value="0" /> ** <add name="LinqExpressionHandler" value="3"/>** </switches> </system.diagnostics>

Don't use '4' as that will give a truckload of info. When you use '3' you'll get in the trace output:
Initial expression to process: value(SD.LLBLGen.Pro.LinqSupportClasses.DataSource2`1[NW26.Adapter.EntityClasses.CustomerEntity]).Where(c => (c.Country = "USA")).GroupBy(c => 0).Select(cc => cc.Count())

so the initial expression tree in textual form.

Miha: could you try with the attached dll (to this post) ?

Frans Bouma | Lead developer LLBLGen Pro
mihies avatar
mihies
User
Posts: 800
Joined: 29-Jan-2006
# Posted on: 14-Mar-2008 16:17:40   

Nope, still an exception out there:

System.Core.dll!System.Linq.Expressions.Expression.IsNullableType(System.Type type = null) + 0xb bytes  
    System.Core.dll!System.Linq.Expressions.Expression.HasIdentityPrimitiveOrNullableConversion(System.Type source = null, System.Type dest = {Name = '((System.Reflection.MemberInfo)(dest)).Name' threw an exception of type 'System.ArgumentNullException' FullName = '((System.Type)(dest)).FullName' threw an exception of type 'System.ArgumentNullException'}) + 0x1e bytes  
    System.Core.dll!System.Linq.Expressions.Expression.Convert(System.Linq.Expressions.Expression expression = {SD.LLBLGen.Pro.LinqSupportClasses.ExpressionClasses.EntityFieldExpression}, System.Type type = {Name = "Object" FullName = "System.Object"}) + 0x1c bytes   
    System.Core.dll!System.Linq.Expressions.Expression.Convert(System.Linq.Expressions.Expression expression, System.Type type, System.Reflection.MethodInfo method) + 0x12 bytes   
    System.Core.dll!System.Linq.Expressions.Expression.MakeUnary(System.Linq.Expressions.ExpressionType unaryType, System.Linq.Expressions.Expression operand, System.Type type, System.Reflection.MethodInfo method) + 0x6a bytes  
    SD.LLBLGen.Pro.LinqSupportClasses.NET35.dll!SD.LLBLGen.Pro.LinqSupportClasses.ExpressionHandlers. GenericExpressionHandler.HandleUnaryExpression(System.Linq.Expressions.UnaryExpression expressionToHandle = {System.Linq.Expressions.UnaryExpression}) + 0xdc bytes   
    SD.LLBLGen.Pro.LinqSupportClasses.NET35.dll!SD.LLBLGen.Pro.LinqSupportClasses.ExpressionHandlers. GenericExpressionHandler.HandleUnaryConvertExpression(System.Linq.Expressions.UnaryExpression expressionToHandle = {System.Linq.Expressions.UnaryExpression}) + 0x37 bytes    
    SD.LLBLGen.Pro.LinqSupportClasses.NET35.dll!SD.LLBLGen.Pro.LinqSupportClasses.ExpressionHandlers. GenericExpressionHandler.HandleExpression(System.Linq.Expressions.Expression expressionToHandle = {System.Linq.Expressions.UnaryExpression}) + 0x75a bytes    
    SD.LLBLGen.Pro.LinqSupportClasses.NET35.dll!SD.LLBLGen.Pro.LinqSupportClasses.ExpressionHandlers. QueryExpressionBuilder.HandleExpression(System.Linq.Expressions.Expression expressionToHandle = {System.Linq.Expressions.UnaryExpression}) + 0x84 bytes   
    SD.LLBLGen.Pro.LinqSupportClasses.NET35.dll!SD.LLBLGen.Pro.LinqSupportClasses.ExpressionHandlers. GenericExpressionHandler.HandleExpressionList(System.Collections.ObjectModel.ReadOnlyCollection <System.Linq.Expressions.Expression> listToHandle = Count = 2) + 0x98 bytes   
    SD.LLBLGen.Pro.LinqSupportClasses.NET35.dll!SD.LLBLGen.Pro.LinqSupportClasses.ExpressionHandlers. GenericExpressionHandler.HandleNewArrayExpression(System.Linq.Expressions.NewArrayExpression expressionToHandle = {System.Linq.Expressions.NewArrayExpression}) + 0x62 bytes  
    SD.LLBLGen.Pro.LinqSupportClasses.NET35.dll!SD.LLBLGen.Pro.LinqSupportClasses.ExpressionHandlers. GenericExpressionHandler.HandleExpression(System.Linq.Expressions.Expression expressionToHandle = {System.Linq.Expressions.NewArrayExpression}) + 0xb1f bytes 
    SD.LLBLGen.Pro.LinqSupportClasses.NET35.dll!SD.LLBLGen.Pro.LinqSupportClasses.ExpressionHandlers. QueryExpressionBuilder.HandleExpression(System.Linq.Expressions.Expression expressionToHandle = {System.Linq.Expressions.NewArrayExpression}) + 0x84 bytes    
    SD.LLBLGen.Pro.LinqSupportClasses.NET35.dll!SD.LLBLGen.Pro.LinqSupportClasses.ExpressionHandlers. QueryExpressionBuilder.HandleProjectionExpression(SD.LLBLGen.Pro.LinqSupportClasses.ExpressionClasses.ProjectionExpression expressionToHandle = {SD.LLBLGen.Pro.LinqSupportClasses.ExpressionClasses.ProjectionExpression}) + 0x14d bytes 
    SD.LLBLGen.Pro.LinqSupportClasses.NET35.dll!SD.LLBLGen.Pro.LinqSupportClasses.ExpressionHandlers. GenericExpressionHandler.HandleExpression(System.Linq.Expressions.Expression expressionToHandle = {SD.LLBLGen.Pro.LinqSupportClasses.ExpressionClasses.ProjectionExpression}) + 0x5ff bytes   
    SD.LLBLGen.Pro.LinqSupportClasses.NET35.dll!SD.LLBLGen.Pro.LinqSupportClasses.ExpressionHandlers. QueryExpressionBuilder.HandleExpression(System.Linq.Expressions.Expression expressionToHandle = {SD.LLBLGen.Pro.LinqSupportClasses.ExpressionClasses.ProjectionExpression}) + 0x84 bytes  
    SD.LLBLGen.Pro.LinqSupportClasses.NET35.dll!SD.LLBLGen.Pro.LinqSupportClasses.ExpressionHandlers. GenericExpressionHandler.HandleSelectExpression(SD.LLBLGen.Pro.LinqSupportClasses.ExpressionClasses.SelectExpression expressionToHandle = {SD.LLBLGen.Pro.LinqSupportClasses.ExpressionClasses.SelectExpression}, SD.LLBLGen.Pro.LinqSupportClasses.ExpressionClasses.SelectExpression newInstance = {SD.LLBLGen.Pro.LinqSupportClasses.ExpressionClasses.SelectExpression}) + 0xae bytes 
    SD.LLBLGen.Pro.LinqSupportClasses.NET35.dll!SD.LLBLGen.Pro.LinqSupportClasses.ExpressionHandlers. GenericExpressionHandler.HandleSelectExpression(SD.LLBLGen.Pro.LinqSupportClasses.ExpressionClasses.SelectExpression expressionToHandle = {SD.LLBLGen.Pro.LinqSupportClasses.ExpressionClasses.SelectExpression}) + 0xaa bytes    
    SD.LLBLGen.Pro.LinqSupportClasses.NET35.dll!SD.LLBLGen.Pro.LinqSupportClasses.ExpressionHandlers. QueryExpressionBuilder.HandleSelectExpression(SD.LLBLGen.Pro.LinqSupportClasses.ExpressionClasses.SelectExpression expressionToHandle = {SD.LLBLGen.Pro.LinqSupportClasses.ExpressionClasses.SelectExpression}) + 0x7d bytes  
    SD.LLBLGen.Pro.LinqSupportClasses.NET35.dll!SD.LLBLGen.Pro.LinqSupportClasses.ExpressionHandlers. GenericExpressionHandler.HandleExpression(System.Linq.Expressions.Expression expressionToHandle = {SD.LLBLGen.Pro.LinqSupportClasses.ExpressionClasses.SelectExpression}) + 0x678 bytes   
    SD.LLBLGen.Pro.LinqSupportClasses.NET35.dll!SD.LLBLGen.Pro.LinqSupportClasses.ExpressionHandlers. QueryExpressionBuilder.HandleExpression(System.Linq.Expressions.Expression expressionToHandle = {SD.LLBLGen.Pro.LinqSupportClasses.ExpressionClasses.SelectExpression}) + 0x84 bytes  
    SD.LLBLGen.Pro.LinqSupportClasses.NET35.dll!SD.LLBLGen.Pro.LinqSupportClasses.LLBLGenProProviderBase. HandleExpressionTree(System.Linq.Expressions.Expression expression = {System.Linq.Expressions.MethodCallExpression}) + 0x3d1 bytes    
    SD.LLBLGen.Pro.LinqSupportClasses.NET35.dll!SD.LLBLGen.Pro.LinqSupportClasses.LLBLGenProProviderBase. Execute(System.Linq.Expressions.Expression expression = {System.Linq.Expressions.MethodCallExpression}) + 0x39 bytes  
    SD.LLBLGen.Pro.LinqSupportClasses.NET35.dll!SD.LLBLGen.Pro.LinqSupportClasses.LLBLGenProProviderBase. System.Linq.IQueryProvider.Execute(System.Linq.Expressions.Expression expression = {System.Linq.Expressions.MethodCallExpression}) + 0x34 bytes   
    SD.LLBLGen.Pro.LinqSupportClasses.NET35.dll!SD.LLBLGen.Pro.LinqSupportClasses.LLBLGenProQuery<object[]>.Execute() + 0x37 bytes  
    SD.LLBLGen.Pro.LinqSupportClasses.NET35.dll!SD.LLBLGen.Pro.LinqSupportClasses.LLBLGenProQuery <object[]>.System.Collections.IEnumerable.GetEnumerator() + 0x38 bytes    
    DevExpress.Data.v8.1.Linq.dll!DevExpress.Data.Linq.Helpers.LinqServerModeCache.CreateTopGroupInfo() + 0xe9 bytes    
    DevExpress.Data.v8.1.Linq.dll!DevExpress.Data.Linq.Helpers.LinqServerModeWrapper.Count.get() + 0x19 bytes   
    DevExpress.Data.v8.1.Linq.dll!DevExpress.Data.Linq.Helpers.LinqServerModeFrontEnd.Count.get() + 0x22 bytes  
Otis avatar
Otis
LLBLGen Pro Team
Posts: 39613
Joined: 17-Aug-2003
# Posted on: 14-Mar-2008 16:30:34   

Could you enable the linqhandler tracer as shown above and post the expression as string? Looks like a new array ctor is planted somewhere inside the query and it's not picked up by our in-memory expression finder.

(btw, I can't download the 8.1 RC, my mvp subscription is for 7.1, or perhaps I'm overlooking it.)

Frans Bouma | Lead developer LLBLGen Pro
Otis avatar
Otis
LLBLGen Pro Team
Posts: 39613
Joined: 17-Aug-2003
# Posted on: 14-Mar-2008 17:33:43   

DevExpress provided me with a query which I think is likely coughing up a bug in our code, so I've to address that (select new object[] { ... } fails).

They said I could use the example project of issue B92896, which is something I'll do so I can test it better locally. Stay tuned.

Frans Bouma | Lead developer LLBLGen Pro
1  /  2