I've an array of objects DataTestplans
from which I try to retrieve records for a particular DataID
and ProductID
using the LINQ query shown, my current query has Distinct()
which distiguishes on all 5 mentioned properties,how do I retrieve distinct records based on properties DataID
,TestPlanName
,TCIndexList
and ProductID
?
DataTestplans:-
[
{
"DataTestPlanID": 0,
"DataID": 19148,
"TestPlanName": "string",
"TCIndexList": "string",
"ProductID": 2033915
},
{
"DataTestPlanID": 0,
"DataID": 19148,
"TestPlanName": "string",
"TCIndexList": "string",
"ProductID": 2033915
},
{
"DataTestPlanID": 0,
"DataID": 19149,
"TestPlanName": "string",
"TCIndexList": "string",
"ProductID": -2642
}
]
LINQ
DataTestPlans_DataID_ProductID = DataTestPlans.Where(c => c.DataID == DataID_ProductID_Record.DataID && c.ProductID == DataID_ProductID_Record.ProductID).Distinct();
You could do like this..
DataTestPlans.Where(c => c.DataID == YourInput && c.ProductID == YourInput)
.GroupBy(x => new {x.DataID,x.TestPlanName,x.TCIndexList,x.ProductID})
.Select(x => x.First());
There are two ways to do, both highlighted in this question, no need for IComparer. Here is a quick example you can play with (I did not use your actual object, because it's easier to explain this way):
class Program
{
static void Main(string[] args)
{
var persons = Setup();
//option 1, can stream, option suggested by Jon Skeet
//https://stackoverflow.com/a/1300116/897326
var result1 = persons.
DistinctBy(m => new {m.FirstName, m.LastName});
//option 2, cannot stream, but does reference to DistinctBy
//https://stackoverflow.com/a/4158364/897326
var result2 = persons.
GroupBy(m => new { m.FirstName, m.LastName }).
Select(group => group.First());
}
class Person
{
public string FirstName { get; set; }
public string LastName { get; set; }
public string Address { get; set; }
}
private static List<Person> Setup()
{
var p1 = new Person
{
FirstName = "John",
LastName = "Doe",
Address = "USA"
};
var p2 = new Person
{
FirstName = "John",
LastName = "Doe",
Address = "Canada"
};
var p3 = new Person
{
FirstName = "Jane",
LastName = "Doe",
Address = "Australia"
};
var persons = new List<Person>();
persons.Add(p1);
persons.Add(p2);
persons.Add(p3);
return persons;
}
}
public static class LinqExtensions
{
public static IEnumerable<TSource> DistinctBy<TSource, TKey>(this IEnumerable<TSource> source, Func<TSource, TKey> keySelector)
{
HashSet<TKey> knownKeys = new HashSet<TKey>();
foreach (TSource element in source)
{
if (knownKeys.Add(keySelector(element)))
{
yield return element;
}
}
}
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With