(Print this page)

Convert SQL queries to LINQ with Linqer
Published date: Friday, May 9, 2014
On: Moer and Éric Moreau's web site

I just found a great little tool called Linqer. This tool generates LINQ queries from SQL statement. Sounds interesting? I said to a friend that if it was working, I would buy me a license.

I had this SQL query that I wanted to transform to LINQ-to-Entities:

SELECT H.*
FROM dbo.CaledonUHHoldings AS H
INNER JOIN dbo.CaledonSeries AS S
ON S.ID = H.SeriesID
INNER JOIN dbo.CaledonFund AS F
ON F.ID = S.FundID
INNER JOIN (
	SELECT F2.ID, MAX(H2.Date) AS Date
	FROM dbo.CaledonUHHoldings AS H2
	INNER JOIN dbo.CaledonSeries AS S2
	ON S2.ID = H2.SeriesID
	INNER JOIN dbo.CaledonFund AS F2
	ON F2.ID = S2.FundID
	GROUP BY F2.ID
) AS A
ON A.ID = F.ID
AND A.Date = H.Date
WHERE H.UnitHolderID = 101

Everybody (!) quickly understand that I am joining 3 tables to get the max date by fund (the inner query) before joining a second time the 3 same tables to get the details. I know there are probably other ways of doing it but my target when I wrote this query was to get the data I wanted.

I am not so bad in LINQ but not an expert. I wanted to get the same query as above but in LINQ so that I could query my model instead of building a function in SQL to query.

Using the trial version of the tool, I connected it to my database AND to my model (.edmx). I pasted my SQL query, ran the query directly in the tool (just to ensure I get proper results) and press the button to convert my query to LINQ. On the right part of the dialog, I then got this LINQ query:

From H In db.CaledonUHHoldings
Join A In ( 
	(From H2 In db.CaledonUHHoldings
	Group New With {H2.CaledonSeries.CaledonFund, H2} By ID = CType(H2.CaledonSeries.CaledonFund.ID,Int32?) Into g = Group 
	Select 
	  ID = CType(ID,Int32?),
	  Date = CType(g.Max(Function(p) p.H2.Date),DateTime?))
	)
      On New With { .ID = H.CaledonSeries.CaledonFund.ID, .Date = H.Date }
  Equals New With { .ID = CInt(A.ID), .Date = CDate(A.Date) }
Where CLng(H.UnitHolderID) = 101
Select 
  H.ID,
  UnitHolderID = H.UnitHolderID,
  SeriesID = H.SeriesID,
  Date = H.Date,
  Holdings = H.Holdings,
  MarketValue = H.MarketValue,
  TimeStamp_TS = H.TimeStamp_TS,
  MAJDate = H.MAJDate,
  MAJLogin = H.MAJLogin

I then copied that query to my project and did minor changes (like changing db for my context) and got it working quickly.

Linqer saved me a lot of time on this query. This query alone saved me more than 60$ USD which is the cost of the license. Now it’s time for me to place my order and for you to give it a try!


(Print this page)