|
BobbyStrain wrote: I don't have a clue as to how to run a stack trace, but I guess I will need to learn. Set a breakpoint in the source code window (click in the margin by the first line of code) of Visual Studio and press F5 to run the program in the debugger. When it stops at the debug point you can single step through the code, line by line, and inspect and change the variables, so you can see exactly what is happening. The debugger is probably the most useful tool at your disposal, so you should really get familiar with it. MSDN has some help information about it at https://msdn.microsoft.com/en-us/library/ms172744.aspx[^].
|
|
|
|
|
After further study, the checkbox change event is triggered during form load. So its handler is executed. I didn't realize that this is normal behavior. I already have a hidden label on the form that is used for another purpose, so I set the text during form load before enabling the checkbox, then skipped the message box display in the handler based on the value. I don't understand enough about senders and sender arguments, but this is probably the professional approach. So I learned a few new things. Thank you both.
Bobby
|
|
|
|
|
I'm trying to run the following query :
Dim lst = (From t In context.MyObj1 where t1.id>6 Select New With { _
.Parent = t, _
.sash = t.child1.AsQueryable.Where(Function(t2) t2.tp=2).Sum(Function(t3) t3.quantity), _
.vlh = t.child1.AsQueryable.Where(Function(t3) t3.tp=2).Sum(Function(t3) t3.value) _
}).ToList
( in this query .quantity and .value have Decimal type.)
but I'm getting this error on runtime :
An unhandled exception of type 'System.InvalidOperationException' occurred in EntityFramework.dll
Additional information: The cast to value type 'System.Decimal' failed because the materialized value is null.
Either the result type's genericparameter or the query must use a nullable type.
It's sure that the collection child1 has items that have .tp=2.
What's wrong ? Thank you !
|
|
|
|
|
It's pretty simple really. It's telling you that, somewhere in your data, you have a null value in the database where this code is expecting a value. It can't convert a null to a Decimal type.
|
|
|
|
|
If I run the query like this :
Dim lst = (From t In context.MyObj1 where t1.id>6 Select New With { _
.Parent = t, _
.sash = t.child1.AsQueryable.Where(Function(t2) t2.tp=2).Select(Function(t3) t3.quantity), _
.vlh = t.child1.AsQueryable.Where(Function(t3) t3.tp=2).Select(Function(t3) t3.value) _
}).ToList
Everything is ok. And it's sure that all the value on database are not null.
So the problem is the function Sum.
|
|
|
|
|
I already told you how to get the query string from the IQueryable object.
Get and execute it in SQL Server Manager. This is an INVALUABLE technique for diagnosing problems in your LINQ query.
I think you'll find the the Sum operation isn't done by LINQ, but by the database engine. You'll also find that the SQL that is generated isn't what you think it is.
modified 16-Feb-15 8:58am.
|
|
|
|
|
It's strange because if I replace the Sum function with Count function , everything works ok , and count values are not Null.
Dim lst = (From t In context.MyObj1 where t1.id>6 Select New With { _
.Parent = t, _
.sash = t.child1.AsQueryable.Where(Function(t2) t2.tp=2).Count(Function(t3) t3.quantity), _
.vlh = t.child1.AsQueryable.Where(Function(t3) t3.tp=2).Count(Function(t3) t3.value) _
}).ToList
|
|
|
|
|
If you try to Count a null collection, it works because there's nothing to Count.
If you try to Sum a null collection, 0 + null isn't defined, so it throws.
|
|
|
|
|
That's the the great thing about LINQ: you can write the most complex operations in a single statement so when it fails you have no idea where the problem is.
|
|
|
|
|
These are the tables :
MyObj1:
Id name
2 name1
7 name7
8 name8
Child1:
ID ParentID TP Quantity Value
1 2 2 7 9
2 7 2 20 10
3 7 2 8 11
( ParentID is the forign key for child1 related to ID field on MyObj )
So the problem is on my query structure or in the tables ?
|
|
|
|
|
Based on that data, you don't have any Child1 rows for the MyObj1 row with ID 8. Since that row is included in your outer query (where t1.id > 6 ), you're trying to take the Sum of an empty sequence.
It seems that the EF query is returning NULL from the database, and then trying to convert that to a Decimal value. This issue is discussed on Matteo Tontini's Blog[^], albeit for C#.
Try casting the properties to Decimal? / Nullable(Of Decimal) before summing them.
Nullable Value Types (Visual Basic) - MSDN[^]
Dim lst = (From t In context.MyObj1 where t1.id>6 Select New With { _
.Parent = t, _
.sash = t.child1.AsQueryable.Where(Function(t2) t2.tp = 2).Sum(Function(t3) DirectCast(t3.quantity, Decimal?)), _
.vlh = t.child1.AsQueryable.Where(Function(t3) t3.tp = 2).Sum(Function(t3) DirectCast(t3.value, Decimal?)) _
}).ToList
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
I try your code , but now I get an error on design time : Decimal Value cannot be converted to Decimal?
|
|
|
|
|
That's annoying - C# just uses (decimal?)t.value , but it seems VB.NET can't cope with that.
You can either use the constructor:
Dim lst = (From t In context.MyObj1 where t1.id > 6 Select New With { _
.Parent = t, _
.sash = t.child1.AsQueryable.Where(Function(t2) t2.tp = 2).Sum(Function(t3) New Decimal?(t3.quantity)), _
.vlh = t.child1.AsQueryable.Where(Function(t3) t3.tp = 2).Sum(Function(t3) New Decimal?(t3.value)) _
}).ToList
Or explicitly specify the type argument for the Sum method:
Dim lst = (From t In context.MyObj1 where t1.id > 6 Select New With { _
.Parent = t, _
.sash = t.child1.AsQueryable.Where(Function(t2) t2.tp = 2).Sum(Of Decimal?)(Function(t3) t3.quantity), _
.vlh = t.child1.AsQueryable.Where(Function(t3) t3.tp = 2).Sum(Of Decimal?)(Function(t3) t3.value) _
}).ToList
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
I try both your methods :
The first produce this error on runtime :
An unhandled exception of type 'System.NotSupportedException' occurred in EntityFramework.SqlServer.dll
Additional information: Only parameterless constructors and initializers are supported in LINQ to Entities.
The second method, produce this error on design time :
Error 103 Overload resolution failed because no accessible 'Sum' accepts this number of type arguments.
|
|
|
|
|
Sorry, I forgot you need to specify the source type parameter as well. Something like:
t.child1.AsQueryable.Where(Function(t2) t2.tp = 2).Sum(Of Child1, Decimal?)(Function(t3) t3.quantity)
where Child1 is the name of your class.
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
Hello !
I'm using this expression :
t.child1.AsQueryable.Where(Function(t2) t2.tp = 2).Sum(Function(t3) CType(t3.quantity, System.Nullable(Of Decimal)))
now I'm not getting any error message , but I have another problem :
As you have noted on your previous posts , the item on MyObj1 with id=8 has no child1 items. But for this item I need that the sums to return 0 in the query , but instead I have no value at all for this item. what should I do ?
Thank you !
|
|
|
|
|
Add a .GetValueOrDefault() call to the end:
t.child1.AsQueryable.Where(Function(t2) t2.tp = 2).Sum(Function(t3) CType(t3.quantity, System.Nullable(Of Decimal))).GetValueOrDefault()
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
Hello !
I try your solution but I get a runtime error :
An unhandled exception of type 'System.NotSupportedException' occurred in EntityFramework.SqlServer.dll
Additional information: LINQ to Entities does not recognize the method 'System.Decimal GetValueOrDefault()' method, and this method cannot be translated into a store expression.
|
|
|
|
|
OK, try moving the .GetValueOrDefault() call to a second Select , with an .AsEnumerable() call to make sure it runs in code rather than SQL:
Dim query = From t In context.MyObj1 where t1.id > 6 Select New With { _
.Parent = t, _
.sash = t.child1.AsQueryable.Where(Function(t2) t2.tp = 2).Sum(Function(t3) CType(t3.quantity, System.Nullable(Of Decimal))), _
.vlh = t.child1.AsQueryable.Where(Function(t3) t3.tp = 2).Sum(Function(t3) CType(t3.value, System.Nullable(Of Decimal))) _
}
Dim lst = query.AsEnumerable().Select(Function(t) New With { _
.Parent = t.Parent, _
.sash = t.sash.GetValueOrDefault(), _
.vlh = t.vlh.GetValueOrDefault() _
}).ToList()
"These people looked deep within my soul and assigned me a number based on the order in which I joined."
- Homer
|
|
|
|
|
Hi, im doing a user profile, and i'd like to include the option which will allow to upload a picture from the computer
|
|
|
|
|
Upload it to where? Is this something to do with Visual Basic or a web based issue?
|
|
|
|
|
It is no issue at all, im creating a profile, and i want to create this option, that when u run the application, you will be able to include a picture to your profile, that you will browse form the computer.
I did some googling, and saw that most the codes for this case include "openfiledialog", link label.. and i just cannot come to an end with this, because i just started learning.
|
|
|
|
|
Member 11447662 wrote: most the codes for this case include "openfiledialog", link label. Quite possibly they do, but that still does not explain what your problem is, or where you plan to upload these images to, or indeed how you plan to upload them. I suggest you study http://www.codeproject.com/Messages/1278601/How-to-get-an-answer-to-your-question.aspx[^], and come back with some more specific details. Saying "I want to do X", does not really help us to help you.
|
|
|
|
|
Hello !
I'm using entity framework , and I have several cases where I should run a query than return some parent items , and after I display these parents and the related children in one report.
I want to know which of these methods have the better performance : ( or is there any other better method ??? )
Method1: (the childs collection are loaded later , using lazy loading)
Dim lista as IQueryable(Of MyObj) = (From t In context.MyObjs Where(..condition..) select t).Tolist
Method2:
Dim lista as IQueryable(Of MyObj) = (From t In context.MyObjs Where(..condition..) _
.Include(Function(t2) t2.Childs1) _
.Include(Function(t2) t2.Childs2) _
.Include(Function(t2) t2.Childs2.Child22) _
.Include(Function(t2) t2.Childs1.Childs11) _
.Include(Function(t2) t2.Childs1.Childs12) _
Select t).ToList
Method3:
Dim lista as IQueryable(Of MyObj)
Dim lst= (From t2 In context.MyObjs Where(..condition..) Select New with _
{ .Parent=t2
.ch1=t2.Childs1 _
.ch2=t2.Childs2 _
.ch21=t2.Childs2.Child21) _
.ch11=t2.Childs1.Childs11) _
.ch12= t2.Childs1.Childs12 _
).ToList
lista=lst.Select(Function(t2) t2.parent)
I noticed that the first method cause the report to open very slow.
Also I read somewhere that Include() cause repeat of parent items , lik in this example :
For example: Master -> Details. Say, master has 100 rows, Details has 5000 rows (50 for each master).
If you lazy-load the details, you return 100 rows (size: master) + 5000 rows (size: details).
If you use .Include("Details"), you return 5000 rows (size: master + details). Essentially, the master portion is duplicated over 50 times.
I don't know the logic when use Projections like in the third mode ? Are the master rows duplicated ?????
But anyway I want a professional opinion in general for the three methods.
Thank you !
|
|
|
|
|
Time it, and compare it to a SQL query.
Bastard Programmer from Hell
If you can't read my code, try converting it here[^]
|
|
|
|