Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Using .Select and .Where in a single LINQ statement

I need to gather Distinct Id's from a particular table using LINQ. The catch is I also need a WHERE statement that should filter the results based only from the requirements I've set. Relatively new to having to use LINQ so much, but I'm using the following code more or less:

private void WriteStuff(SqlHelper db, EmployeeHelper emp) {     String checkFieldChange;     AnIList tableClass = new AnIList(db, (int)emp.PersonId);     var linq = tableClass.Items         .Where(            x => x.UserId == emp.UserId               && x.Date > DateBeforeChanges               && x.Date < DateAfterEffective               && (                      (x.Field == Inserted)                   || (x.Field == Deleted)))                 )              ).OrderByDescending(x => x.Id);      if (linq != null)     {         foreach (TableClassChanges item in linq)         {             AnotherIList payTxn = new AnotherIList(db, item.Id);             checkFieldChange = GetChangeType(item.FieldName);              // Other codes that will retrieve data from each item              // and write it into a text file         }     } } 

I tried to add .Distinct for var linq but it's still returning duplicate items (meaning having the same Id's). I've read through a lot of sites and have tried adding a .Select into the query but the .Where clause breaks instead. There are other articles where the query is somehow different with the way it retrieves the values and place it in a var. I also tried to use .GroupBy but I get an "At least one object must implement IComparable" when using Id as a key.

The query actually works and I'm able to output the data from the columns with the specifications I require, but I just can't seem to make .Distinct work (which is the only thing really missing). I tried to create two vars with one triggering a distinct call then have a nested foreach to ensure the values are just unique, but will thousands of records to gather the performance impact is just too much.

I'm unsure as well if I'd have to override or use IEnumerable for my requirement, and thought I'd ask the question around just in case there's an easier way, or if it's possible to have both .Select and .Where working in just one statement?

like image 840
robertviper08 Avatar asked Feb 23 '12 09:02

robertviper08


People also ask

Can we use multiple where clause in LINQ?

Well, you can just put multiple "where" clauses in directly, but I don't think you want to. Multiple "where" clauses ends up with a more restrictive filter - I think you want a less restrictive one.

How do you use take and skip in LINQ?

How to make use of both Take and Skip operator together in LINQ C#? The Take operator is used to return a given number of elements from an array and the Skip operator skips over a specified number of elements from an array. Skip, skips elements up to a specified position starting from the first element in a sequence.

What is the use of select in LINQ?

LINQ Select comes under the Projection Operator, the select operator used to select the properties to display/selection. Select operator is mainly used to retrieve all properties or only a few properties which we need to display. It is used to select one or more items from the list of items or from the collection.


1 Answers

Did you add the Select() after the Where() or before?

You should add it after, because of the concurrency logic:

 1 Take the entire table    2 Filter it accordingly    3 Select only the ID's    4 Make them distinct.   

If you do a Select first, the Where clause can only contain the ID attribute because all other attributes have already been edited out.

Update: For clarity, this order of operators should work:

db.Items.Where(x=> x.userid == user_ID).Select(x=>x.Id).Distinct(); 

Probably want to add a .toList() at the end but that's optional :)

like image 185
Flater Avatar answered Oct 20 '22 15:10

Flater