How to do in LINQ??

I am using vb.net. I have a data table with these columns:
Dep
Qty
Cost
Sales

In SQL I would do:
Select
Max(Dep) dep,
count(*) cnt,
Sum(qty) qty,
Sum(Cost*qty) Cost
Sum(sales*qty) Sales
From tbl
Group By dep
Order By dep

How can I do this in LINQ?
LVL 1
Jess31Asked:
Who is Participating?

[Product update] Infrastructure Analysis Tool is now available with Business Accounts.Learn More

x
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

Ess KayEntrapenuerCommented:
You can have a look at these tools to convert SQl to LINQ:

LINQPAD - https://www.linqpad.net/  (Free)

or Linqer http://www.sqltolinq.com/ (paid)
0
Jess31Author Commented:
I tried LINQPAD, it runs my query, but I don't see how to get the conversion to LINQ
0
Ess KayEntrapenuerCommented:
Theres an example here


https://sampathloku.blogspot.com/2012/08/how-to-convert-linq-entity-query-into-t.html

It does linq to sql, just check the other options to convert it backwords
0
Learn Ruby Fundamentals

This course will introduce you to Ruby, as well as teach you about classes, methods, variables, data structures, loops, enumerable methods, and finishing touches.

Fernando SotoRetiredCommented:
Hi Jess31;

See if this give you what you are looking for.
'' Change all Field(0f Integer) to the correct DataType
Dim results = (From r In dt.AsEnumerable()
               Group r By Key = r.Field(Of Integer)("Dep") Into depGroup = Group
               Order By Key
               Select New With {
                   .Dep = Key,
                   .Cnt = depGroup.Count(),
                   .Qty = depGroup.Sum(Function(q) q.Field(Of Integer)("Qty")),
                   .Cost = depGroup.Sum(Function(c) c.Field(Of Integer)("Qty") * c.Field(Of Integer)("Cost")),
                   .Sales = depGroup.Sum(Function(c) c.Field(Of Integer)("Qty") * c.Field(Of Integer)("Sales"))
               }).ToList()
               

Open in new window

0
Jess31Author Commented:
yes, I see his seems to return the SQL for the LINQ but for me it doesn't return the LINQ from the SQL

linq1.png
0
Fernando SotoRetiredCommented:
To your statement, "yes, I see his seems to return the SQL for the LINQ but for me it doesn't return the LINQ from the SQL". Are you querying the SQL database or the DataTable object in code?
0
Jess31Author Commented:
SQL Database. The Datatable is created in code, I don't know if I am able to query against it in this tool
0
Fernando SotoRetiredCommented:
Are you using the SQL database to get the information you posted in the question or have you crated a DataTable object and filled it in some other means and wish to query that DataTable?
0
Jess31Author Commented:
I am using a table on SQL DB that is similar to the DataTable against which I want to run LINQ
0
Ess KayEntrapenuerCommented:
Jess, My mistake,


Linqpad doesn't convert SQL to LINQ, only the other way (LINQ to SQL)  It relies on the .Net Linq-to-Sql library or Entity framework for the translation.
0
Fernando SotoRetiredCommented:
So if you are wanting to query the DataTable object that is in local memory then try my last post that has the Linq query. Also in that query you will need to change, dt in dt.AsEnumerable(), to your actual instance name for the DataTable object.
0
it_saigeDeveloperCommented:
*NO POINTS*

Proof of concept:
Imports System.Data.SqlClient

Module Module1
	Sub Main()
		Dim adapter As SqlDataAdapter = Nothing
		Dim table As DataTable = Nothing
		Dim [list] As List(Of Department)
		Try
			Connection.Open()
			If Connection.State.Equals(ConnectionState.Open) Then
				table = New DataTable()
				[list] = New List(Of Department)()
				adapter = New SqlDataAdapter("SELECT * FROM SALESTABLE", Connection)
				adapter.Fill(table)
				For Each row As DataRow In table.Rows
					[list].Add(New Department() With {.Department = row("DEPT"), .Quantity = row("QTY"), .Cost = row("COST"), .Sales = row("SALES")})
				Next
			End If
		Finally
			If adapter IsNot Nothing Then adapter.Dispose()
		End Try
		Dim a1 = (From row In table
				Order By row("DEPT")
				Group row By DEPT = row("DEPT") Into g = Group
				Select New With
					  {
						Key DEPT,
						    .CNT = g.Count(),
						    .QTY = g.Sum(Function(x) x("QTY")),
						    .COST = g.Sum(Function(x) x("COST") * x("QTY")),
						    .SALES = g.Sum(Function(x) x("SALES") * x("QTY"))
						 })
		Dim a2 = (From item In [list]
			Order By item.Department
			Group item By DEPT = item.Department Into g = Group
			Select New With
			{
				Key DEPT,
				    .CNT = g.Count(),
				    .QTY = g.Sum(Function(x) x.Quantity),
				    .COST = g.Sum(Function(x) x.Cost * x.Quantity),
				    .SALES = g.Sum(Function(x) x.Sales * x.Quantity)
				})

		Console.WriteLine("From a datatable")
		For Each group In a1
			Console.WriteLine(group)
		Next

		Console.WriteLine()
		Console.WriteLine("From a list")
		For Each group In a2
			Console.WriteLine(group)
		Next
		Console.ReadLine()
	End Sub
End Module

Module Globals
	Public Property Connection() As SqlConnection = New SqlConnection("Data Source=.;Initial Catalog=EE_Q28970321;Integrated Security=True")
End Module

Class Department
	Public Property Department() As Integer
	Public Property Quantity() As Integer
	Public Property Cost() As Decimal
	Public Property Sales() As Decimal
End Class

Open in new window

From a set of data in the database -Capture.JPGProduces the following output from SQL -Capture.JPGAnd the following output from the application using LINQ -Capture.JPG-saige-
0
Jess31Author Commented:
Fernando Soto
I got the code to do the Group Totals, etc.
If I just wanted total aggregation with not groups what change do I need to make ?
0
Fernando SotoRetiredCommented:
Please post the query you are working with. When you say, "If I just wanted total aggregation with not groups", does that mean you do not want any Grouping?
0
Jess31Author Commented:
Right not grouping.
dt =
Name
Salary
Benefits

And I want grand total of Salary and Benefits (name is ignored)
0
Fernando SotoRetiredCommented:
Hi Jess31;

Something like this should work.
Dim results = (From r In dt.AsEnumerable()
               Group By Key = "OneGroup" Into justOneGroup = Group
               Select New With {
                   .Salary = justOneGroup.Sum(Function(s) s.Field(Of Integer)("Salary")),
                   .Benefits = justOneGroup.Sum(Function(c) c.Field(Of Integer)("Benefits")
               }).ToList()

Open in new window

But the fields are not the same, is this a different question?
0
Jess31Author Commented:
But I am asking specifically w/o Grouping, just grand totals
0
Fernando SotoRetiredCommented:
Hi Jess31;

I know you did. I needed to group so that I can do the Sum function so I grouped ALL rows into one group which then allowed me to do the calculations, not really grouping.
0

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
Visual Basic.NET

From novice to tech pro — start learning today.