LINQ query on sorting the data - linq

I have an object View model which has Id field in the properties. My ID are in following form:
001_001
001_002
002_001
002_002
002_003
002_004
003_001
and so on... I want to sort the data but when I sort it sort thinking it string.
So, what I want is it should sort it as int. So, I have following linq query:
ObjectViewModels.OrderBy ( ids => ids.id )
.GroupBy ( s => int.Parse (s.Id.ToString().Split (new string[] {"_"}, StringSplitOptions.None)[1] ) ).ToList ( ) ;
But it does not seem to work. Thanks for the help.

You can use OrderBy then re-sort using ThenBy.
I'm not sure why you do the GroupBy so I didn't add it to the example
ObjectViewModels.OrderBy(x => int.Parse(x.ID.ToString().Split('_')[0]))
.ThenBy(y => int.Parse(y.ID.ToString().Split('_')[1]));

Related

linq query with count

I would like to create a simple linq query, but I don't really know, how it should be. I have searched the net, but found nothing, what I can use or I don't know yet, that I could use it.
So, basically, I have a table with this fields: reference, vat_code, amount, vat_amount, supplier.
Now, I would like to query the records, where reference<>'' and the reference is more than once in the table. But I need all the occupians.
F.e. from
1;VF;100;27;345
2;VF;200;54;123
2;VF;-200;-54;123
2;VF;200;54;123
3;VF;300;81;888
to
2;VF;200;54;123
2;VF;-200,-54;123
2;VF;200;54;123
How would be look the linq query to this?
Thanks.
If rows with same reference should go together in results, then you should filter out rows with reference equal to empty string, then group all rows by reference and select only those groups which have more than one row.
C# sample with DataTable:
var result = dt.AsEnumerable()
.Where(r => r.Field<string>("reference") != "")
.GroupBy(r => r.Field<string>("reference"))
.Where(g => g.Count() > 1)
.SelectMany(g => g); // flatten group to sequence of rows

LINQ to Entities multiple columns need 1 to be distinct

I am trying to select multiple columns from an entity object but I want 1 property to be distinct. I am very new to both LINQ and Entity Framework so any help will be useful.
Here is my LINQ query so far:
var listTypes = (from s in context.LIST_OF_VALUES
orderby s.SORT_INDEX
select new { s.LIST_TYPE, s.DISPLAY_TEXT });
I want s.LIST_TYPE to be distinct. I figure using the groupby keyword is what I want (maybe?) but I have not found a way to use it that works.
Thank you.
Assuming DISPLAY_TEXT matches LIST_TYPE somehow (so you don't lose any information):
var distinct = context.LIST_OF_VALUES
.OrderBy(s => s.SORT_INDEX)
.GroupBy(s => s.LIST_TYPE)
.Select(g => new { g.Key, g.First().DISPLAY_TEXT });

How can I sort by multiple fields in LINQ?

how can I do multiple sort in
return (from p in _db.Pages where p.int_PostStatusId == 2 select p).OrderByDescending(m => m.int_SortOrder);
i want to do order by by int_PageId as well? first by int_SortOrder then by int_PageId
Use either ThenBy or ThenByDescending to order the result of an OrderBy or OrderByDescending:
return (...)
.OrderByDescending(m => m.int_SortOrder)
.ThenBy(m => m.int_PageId);
Or using the query syntax:
orderby p.int_SortOrder descending, p.int_PageId

Limiting fields returned in a LINQ query

A few days ago I asked a question about returning select fields from a LINQ query. Now, I want to add some grouping to the results and things are not working out.
The following query returns the correct rows but I want to limit the fields returned. For example, I only want to see the Id and Name fields.
var contactsFromDealers = Contacts.Where(x => x.ContactTypeID == 2).GroupBy (x => x.OrganizationName)
and appending .Select (x => x.Id, x.OrganizationName) doesn't help.
Any suggestions? Thanks!
you need the select before the group by i believe.
try .Select( x => new { x.Name } )

Lost with LINQ and Expressions

I'm trying to write a LINQ query on some objects where I need to only do a select if a filter value is set.
Is there a way to "change" the query dynamically to only do a select if this is set.
Use where to find the items of interest, e.g.:
collection.Where(i => PassesFilter(i)).Select(i => i.InterestingValue);
var query = Somthing().Where(x => x.IsSomethingYouAlwaysFilterBy);
if(FilterValueIsSet(filterValue))
{
query = query.Where(x => x.Property == filterValue)
}
I'm not sure I understand your question, but you can use predicate builder. Predicate Builder example here

Resources