Solved

How to do in LINQ??

Posted on 2016-09-16
18
64 Views
Last Modified: 2016-09-21
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?
0
Comment
Question by:Jess31
  • 7
  • 7
  • 3
  • +1
18 Comments
 
LVL 15

Expert Comment

by:Ess Kay
ID: 41801564
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
 

Author Comment

by:Jess31
ID: 41801628
I tried LINQPAD, it runs my query, but I don't see how to get the conversion to LINQ
0
 
LVL 15

Expert Comment

by:Ess Kay
ID: 41801818
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
How our DevOps Teams Maximize Uptime

Our Dev teams are like yours. They’re continually cranking out code for new features/bugs fixes, testing, deploying, responding to production monitoring events and more. It’s complex. So, we thought you’d like to see what’s working for us. Read the use case whitepaper.

 
LVL 63

Expert Comment

by:Fernando Soto
ID: 41801948
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
 

Author Comment

by:Jess31
ID: 41802011
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
 
LVL 63

Expert Comment

by:Fernando Soto
ID: 41802019
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
 

Author Comment

by:Jess31
ID: 41802061
SQL Database. The Datatable is created in code, I don't know if I am able to query against it in this tool
0
 
LVL 63

Expert Comment

by:Fernando Soto
ID: 41802075
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
 

Author Comment

by:Jess31
ID: 41802098
I am using a table on SQL DB that is similar to the DataTable against which I want to run LINQ
0
 
LVL 15

Expert Comment

by:Ess Kay
ID: 41802101
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
 
LVL 63

Expert Comment

by:Fernando Soto
ID: 41802104
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
 
LVL 33

Expert Comment

by:it_saige
ID: 41802171
*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
 

Author Comment

by:Jess31
ID: 41807518
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
 
LVL 63

Expert Comment

by:Fernando Soto
ID: 41807586
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
 

Author Comment

by:Jess31
ID: 41807654
Right not grouping.
dt =
Name
Salary
Benefits

And I want grand total of Salary and Benefits (name is ignored)
0
 
LVL 63

Expert Comment

by:Fernando Soto
ID: 41807743
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
 

Author Comment

by:Jess31
ID: 41808724
But I am asking specifically w/o Grouping, just grand totals
0
 
LVL 63

Accepted Solution

by:
Fernando Soto earned 500 total points
ID: 41808832
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

Featured Post

MIM Survival Guide for Service Desk Managers

Major incidents can send mastered service desk processes into disorder. Systems and tools produce the data needed to resolve these incidents, but your challenge is getting that information to the right people fast. Check out the Survival Guide and begin bringing order to chaos.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
Complex SQL statement in VB.NET 7 31
Visual studio 2015 1 21
SSRS Deployment problem 5 64
VB.net -  GroupBox / Panel DataBinding and behavior 3 12
This document covers how to connect to SQL Server and browse its contents.  It is meant for those new to Visual Studio and/or working with Microsoft SQL Server.  It is not a guide to building SQL Server database connections in your code.  This is mo…
The ECB site provides FX rates for major currencies since its inception in 1999 in the form of an XML feed. The files have the following format (reducted for brevity) (CODE) There are three files available HERE (http://www.ecb.europa.eu/stats/exch…
In a recent question (https://www.experts-exchange.com/questions/29004105/Run-AutoHotkey-script-directly-from-Notepad.html) here at Experts Exchange, a member asked how to run an AutoHotkey script (.AHK) directly from Notepad++ (aka NPP). This video…
In an interesting question (https://www.experts-exchange.com/questions/29008360/) here at Experts Exchange, a member asked how to split a single image into multiple images. The primary usage for this is to place many photographs on a flatbed scanner…

808 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question