I have a table with rows containing the following numbers:
4191808.51
3035280.22
3437796.06
4013772.33
1740652.56
0
The sum of that table is 16419309.68.
When I do a Linq SUM query on that table, it returns a whole different number: 19876858.14
The code I use to do the sum is as follows:
IEnumerable<MyData> data = _myRepository.GetMatching(myValue);
decimal sumSales = data.Sum(x => x.Sales);
What could be causing this? I suspect some max decimal value but couldn't find info on that
can you please examine your
IEnumerable<MyData> data = _myRepository.GetMatching(myValue);
in the debugger after the execution. I'm suspecting that you are selecting some different set of data - not what you have shown in the sample. I attempted to recreated you situation LinqPad, but constantly getting the correct answer.
decimal[] data = {
4191808.51m
,3035280.22m
,3437796.06m
,4013772.33m
,1740652.56m
,0m
};
decimal sumSales = data.Sum();
sumSales.Dump();
and getting: 16419309.68
Related
I was wondering if someone could help me out.
I have 2 sets of data being returned from an API which i need to chart to a line graph, the problem is i dont know which set of results will come at any given time, so i need something that will be able to chart both sets of the results.
The first set has the following info, ( taken from a var_dump )
'series' => string '[{name: 'Data'}]'
'data_lines' => string '[[[1473731108000,3.4804],[1473731406000,1.7047],[1473731704000,1.7559],[1473732004000,1.2774],[1473732304000,1.9295]]]'
The first number is a timestamp, and the second number is the plot point in GB, and the series name is the series name obviously.
The above set of results only needs one line, the second set of data is an averaging set of results and needs 3 lines, its response is as follows:
'series' => string '[{name: 'Data (average)'},{name: 'Data (maximum)'},{name: 'Data (minimum)'}]'
'data_lines' => string '[[[1473638400000,1.5094]],[[1473638400000,6.7825]],[[1473638400000,1.0546]]]'
and this one obviously has 3 data values for the 3 labels per timestamp.
Any help in getting this going would be greatly appreciated.
This is my sugestion: Create a function that will act like a router for your results. I don't know how you are processing your results (PHP or javascript), BTW:
function chartSelector($data) {
if (count($data['series']) == 3) {
//put the logic to process the averaging set of results here
} else {
//put the logic for the other set here
}
}
This function will direct the processing according to the given set of data :)
I have following query against EF whereby mysql was used:
var query = from r in context.myContext
where r.clmn1.CompareTo("2015-11-19 00:00:00") > 0)
orderby r.someColumn
select r;
return query;
The number of returned rows is as expected. however some values of the property r.clmn2 repeat itself in the result of the query. For example I could not find clmn2 == 220011 because it was "overwritten" by the value 220033 (The value 220033 is correct and expected but should not "overwrite" other values). Strangely enough, when I add this condition to the query I get it in the result (of course then only and only this value) which means that the first condition is also valid for clmn2:
var query = from r in context.myContext
where r.clmn1.CompareTo("2015-11-19 00:00:00") > 0) && r.clmn2.Equals("220011")
orderby r.someColumn
select r;
return query;
The same query (the first one) works at DB-level and returns all values (will not be overwritten)
SELECT * FROM myContext.myTable
WHERE r.clmn1 > ("2015-11-19 00:00:00")
ORDER BY r.someColumn
It should be a problem of EF. I hope someone could help me!
Thanks in Advance.
I have prefixed the column/property clmn2 with [key] atribute in the generated entity class so that it is now a part of the multiple key, i.e., with other columns/properties. It works and i get all values from DB. Maybe cus this property comes from a DB-view, Visual Studio could not recognize it as a primary key as done by other properties.
I have the following array of price ranges how can I perform a query to find the price range between these using and operator
This is the array I have
["0-1000", "5001_15000", "15001_25000"]
Whether this is the only way I have to perform else is ther any methods to perform such filter
select * from posts where price between 0 and 1000 and price between 5001 and 15000
Edit-1
As your said I tried in my console
a = [[0,1000],[5001 ,15000], [15001, 25000]]
(a[0].first..a[0].last)
This gives 0..1000 and when I try
(a[0].first..a[0].last and a[1].first..a[1].last)
It shows only 5001..15000 can you explain it please.
Edit-2
Only this works how can I add more values
Post.where(price: a[0].first..a[0].last)
I'd start adjusting your price range array.
From:
["0-1000", "5001_15000", "15001_25000"]
to
a = [[0,1000],[5001 ,15000], [15001, 25000]]
This will give you access to first and last price range bounds with
(a[0].first..a[0].last))
The above is a range that will product 0..1000 which you can plug into active record, (using the hash syntax of course)
example:
Post.where(price: a[0].first..a[0].last)
make it into a resusable scope to be able to chain them to accomate the Ands or just write the raw sql.
Hope this helps
For Dynamic array length, Try this
arr = [["0", "100"], ["100", "200"]]
query_string = ""
arr.each {|a| query_string << (arr.last == a ? " price between #{a.first} and #{a.last}" : "price between #{a.first} and #{a.last} or") }
Product.where(query_string)
Which finds the expected records
I have searched for too many hours. Calculate TotalAmount from all Rows in Table was as close as I could find but could not get it to work.
I have a table called "ServiceEntered" and I need the SUM of the column "Price" to be displayed on the page. I have tried to change the field type in the table too but with no success.
I am using this code:
decimal money = 0.00m;
var prices = "SELECT SUM(Price) FROM ServiceEntered";
var db = Database.Open("OMD");
var result = db.QuerySingle(prices);
money = Convert.ToDecimal(result);
and have #money in the page.
It give me this error: Unable to cast object of type 'WebMatrix.Data.DynamicRecord' to type 'System.IConvertible'.
The SQL you are using is correct. However, the return type of the QuerySingle method is an object with properties generated dynamically from the database column(s) in your query. You have none - nor do you have any aliases for the expressions your SQL generates (the result of the SUM function). In fact, since you are only retrieving a scalar value from the database, you should use QueryValue instead. Try this:
var prices = "SELECT SUM(Price) FROM ServiceEntered";
var db = Database.Open("OMD");
var result = db.QueryValue(prices);
And then in your page you can use:
#result
I've stumbled upon a very strange LINQ to SQL behaviour / bug, that I just can't understand.
Let's take the following tables as an example: Customers -> Orders -> Details.
Each table is a subtable of the previous table, with a regular Primary-Foreign key relationship (1 to many).
If I execute the follow query:
var q = from c in context.Customers
select (c.Orders.FirstOrDefault() ?? new Order()).Details.Count();
Then I get an exception: Could not format node 'Value' for execution as SQL.
But the following queries do not throw an exception:
var q = from c in context.Customers
select (c.Orders.FirstOrDefault() ?? new Order()).OrderDateTime;
var q = from c in context.Customers
select (new Order()).Details.Count();
If I change my primary query as follows, I don't get an exception:
var q = from r in context.Customers.ToList()
select (c.Orders.FirstOrDefault() ?? new Order()).Details.Count();
Now I could understand that the last query works, because of the following logic:
Since there is no mapping of "new Order()" to SQL (I'm guessing here), I need to work on a local list instead.
But what I can't understand is why do the other two queries work?!?
I could potentially accept working with the "local" version of context.Customers.ToList(), but how to speed up the query?
For instance in the last query example, I'm pretty sure that each select will cause a new SQL query to be executed to retrieve the Orders. Now I could avoid lazy loading by using DataLoadOptions, but then I would be retrieving thousands of Order rows for no reason what so ever (I only need the first row)...
If I could execute the entire query in one SQL statement as I would like (my first query example), then the SQL engine itself would be smart enough to only retrieve one Order row for each Customer...
Is there perhaps a way to rewrite my original query in such a way that it will work as intended and be executed in one swoop by the SQL server?
EDIT:
(longer answer for Arturo)
The queries I provided are purely for example purposes. I know they are pointless in their own right, I just wanted to show a simplistic example.
The reason your example works is because you have avoided using "new Order()" all together. If I slightly modify your query to still use it, then I still get an exception:
var results = from e in (from c in db.Customers
select new { c.CustomerID, FirstOrder = c.Orders.FirstOrDefault() })
select new { e.CustomerID, Count = (e.FirstOrder != null ? e.FirstOrder : new Order()).Details().Count() }
Although this time the exception is slightly different - Could not format node 'ClientQuery' for execution as SQL.
If I use the ?? syntax instead of (x ? y : z) in that query, I get the same exception as I originaly got.
In my real-life query I don't need Count(), I need to select a couple of properties from the last table (which in my previous examples would be Details). Essentially I need to merge values of all the rows in each table. Inorder to give a more hefty example I'll first have to restate my tabels:
Models -> ModelCategoryVariations <- CategoryVariations -> CategoryVariationItems -> ModelModuleCategoryVariationItemAmounts -> ModelModuleCategoryVariationItemAmountValueChanges
The -> sign represents a 1 -> many relationship. Do notice that there is one sign that is the other way round...
My real query would go something like this:
var q = from m in context.Models
from mcv in m.ModelCategoryVariations
... // select some more tables
select new
{
ModelId = m.Id,
ModelName = m.Name,
CategoryVariationName = mcv.CategoryVariation.Name,
..., // values from other tables
Categories = (from cvi in mcv.CategoryVariation.CategoryVariationItems
let mmcvia = cvi.ModelModuleCategoryVariationItemAmounts.SingleOrDefault(mmcvia2 => mmcvia2.ModelModuleId == m.ModelModuleId) ?? new ModelModuleCategoryVariationItemAmount()
select new
{
cvi.Id,
Amount = (mmcvia.ModelModuleCategoryVariationItemAmountValueChanges.FirstOrDefault() ?? new ModelModuleCategoryVariationItemAmountValueChange()).Amount
... // select some more properties
}
}
This query blows up at the line let mmcvia =.
If I recall correctly, by using let mmcvia = new ModelModuleCategoryVariationItemAmount(), the query would blow up at the next ?? operand, which is at Amount =.
If I start the query with from m in context.Models.ToList() then everything works...
Why are you looking into only the individual count without selecting anything related to the customer.
You can do the following.
var results = from e in
(from c in db.Customers
select new { c.CustomerID, FirstOrder = c.Orders.FirstOrDefault() })
select new { e.CustomerID, DetailCount = e.FirstOrder != null ? e.FirstOrder.Details.Count() : 0 };
EDIT:
OK, I think you are over complicating your query.
The problem is that you are using the new WhateverObject() in your query, T-SQL doesnt know anyting about that; T-SQL knows about records in your hard drive, your are throwing something that doesn't exist. Only C# knows about that. DON'T USE new IN YOUR QUERIES OTHER THAN IN THE OUTER MOST SELECT STATEMENT because that is what C# will receive, and C# knows about creating new instances of objects.
Of course is going to work if you use ToList() method, but performance is affected because now you have your application host and sql server working together to give you the results and it might take many calls to your database instead of one.
Try this instead:
Categories = (from cvi in mcv.CategoryVariation.CategoryVariationItems
let mmcvia =
cvi.ModelModuleCategoryVariationItemAmounts.SingleOrDefault(
mmcvia2 => mmcvia2.ModelModuleId == m.ModelModuleId)
select new
{
cvi.Id,
Amount = mmcvia != null ?
(mmcvia.ModelModuleCategoryVariationItemAmountValueChanges.Select(
x => x.Amount).FirstOrDefault() : 0
... // select some more properties
}
Using the Select() method allows you to get the first Amount or its default value. I used "0" as an example only, I dont know what is your default value for Amount.