Ho provato per molte ore a creare una query di Linq con distinti e ordinati. In questo articolo viene descritto il problema generale con questo. L'unico modo in cui ho trovato una soluzione era creare una semplice query SQL
SELECT TOP (10) [DATA]
FROM TestResult
inner join TestResultRelated on TestResultRelated.TestResult = TestResult.ID
WHERE TestResultRelated.PATH = 'TestResultRelatedAdditionalData.SoftwareVersion'
AND TestResult.USER_LOGIN_NAME = 'emilwkj'
AND TestResultRelated.DATA != ''
group by TestResultRelated.DATA order by max([START_DATE_TIME]) desc
Non ho bisogno di una soluzione a questo problema esatto, ma ecco un esempio del problema:
Table 1:
ID | DateUsed | Version
1 | 01/01/2018 | 1.0
2 | 02/03/2018 | 1.1
3 | 05/05/2018 | 1.0
4 | 04/06/2018 | 1.4
Nella tabella sopra, come sarebbe possibile in LinQ estrarre le ultime 3 versioni software utilizzate per ultime?
Questo può essere raggiunto in LinQ?
fare qualcosa del genere: (Aggiorna il nome della colonna come per il tuo)
var query = (from c in TestResult
join tbl2 in TestResultRelated on c.ID equals tbl2.TestResult
where c.USER_LOGIN_NAME = 'emilwkj' and tbl2.DATA != ''
orderby tbl2.DATA
group tbl2 by tbl2.DATA into g
select new
{
Id = g.Key.Id,
Name = g.Key.Name,
TestResultRelated = g
})
.Distinct() //.Distinct(x=>x.someColumn)
.OrderByDescending(x => x.date);
.Take(10)
Come abbiamo capito, stai utilizzando efcore e DbContext che sollevano la tabella TestResult e TestResultRelated.
Ecco il codice del problema che comprendiamo dalla tua domanda.
var db=new DbContext();
var result = (from a in db.TestResult
join b in db.TestResultRelated on a.ID equals b.TestResult
where b.PATH == "TestResultRelatedAdditionalData.SoftwareVersion"
& a.USER_LOGIN_NAME == "emilwkj" & b.DATA!=" "
group b by b.DATA into item
orderby item.Max(e=>e.START_DATE_TIME) descending
select item)
.Take(10);