2

How would I convert this query from SQL to Linq:

SELECT status As 'Status', count(status) As 'Count' FROM tbl_repair_order WHERE contract = 'con' and (status = 'Parts Arr' or status = 'NA' or status = 'New Call' or status = 'Parts Ord' or status = 'Parts Req' or status = 'F Work') GROUP BY status 

Update

Thanks Guys, this is the code I used. Tested and returns the same as above:

 List<string> statuses = new List<string> { "Parts Arr", "NA", "New Call", "Parts Ord", "Parts Req", "F Work"}; var result = (from x in db.tbl_repair_orders where x.CONTRACT == strContract && statuses.Contains(x.STATUS) group x.STATUS by x.STATUS into grouping select new { Status = grouping.Key, Count = grouping.Count() }); return result; 
3
  • I think you should heed Eamon's warning in the second bullet point of his answer. Commented Jul 20, 2009 at 16:09
  • 1
    Actually, the .Contains() call does correctly translate to LinqToSql (and maybe to the EF as well) - blog.wekeroad.com/2008/02/27/… Commented Jul 20, 2009 at 16:20
  • After reading that link, it's also worth noting that using an array instead of List will generate an IN statement. Commented Jul 20, 2009 at 16:41

3 Answers 3

4
 string[] statuses = new string[] { "Parts Arr", "NA", "New Call", "Parts Ord", "Parts Req", "F Work" }; var x = (from ro in db.tbl_repair_order where ro.contract == "con" && statuses.Contains(ro.status) group 0 by ro.status into grouping select new { Status = grouping.Key, Count = grouping.Count() }); 

I don't know if the syntax is correct (especially the last two lines) but it should be pretty close.

I added the 0 between group and by based on Eamon Nerbonne's correction in the comments. Also, thanks to Ryan Versaw for the link explaining List and arrays for generating IN clauses.

Sign up to request clarification or add additional context in comments.

11 Comments

It should be grouping.Key - besides that, I think it looks correct.
The main difference I had in my version (similar enough I'm not posting a new answer) is to use a list. List<string> statuses = new List<string> { "Parts Arr", "NA", "New Call", "Parts Ord", "Parts Req", "F Work"}; Then change the where conditions to this: ro.contract = "con" && statuses.Contains(ro.status)
@Ryan, thanks for the Key tip, I also noticed that after posting it.
@Ryan, do you mind if I edit the answer to include your alternative? I like that better than the mass of ORs.
@Andy: the syntax is group <expression to include in group> by <group key> into <groupName>
|
2

Assuming you wire up your table's appropriately, something like

var statusCounts = from row in youDbNameHere.tbl_repair_order where row.contract == "con" && (row.status == "Parts Arr" || row.status == "NA" || row.status == "New Call" || row.status == "Parts Ord" || row.status == "Parts Req" || row.status == "F Work") group 0 by row.status into g select new { Status = g.Key, StatusCount = g.Count() }; 

...and I see Andy beat me to it ;-)

Notes:

  • You need to include an expression between "group" and "by", this expression is will be evaluated to form the set of values accessible under the group's key (in your case it's irrelevant, so a zero is fine).
  • If you wish to use Linq-to-Sql or Linq-to-Entities (or some other IQueryable implementation), be aware that your code will not execute directly in C#, but rather be translated (as it should be) into sql -- so avoid using .NET specific calls that cannot be translated, as these will generally cause a run-time exception or (rarely) cause the resulting query to be partially evaluated client-side (at a potentially hefty performance cost).

Comments

-1

As far a s converting SQL statements to equivalent Linq to SQL statements you should check out the Linqer tool which does just that. I don't think this app is good to use for re-writting your whole application but it can be a very useful tool for learning Linq to SQL in general.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.