hej, mam problem ze zbudowaniem zapytania w .net uzywajac Expreession (z LINQ)
mam model
public class SomeModel
{
public int SomeInt{get;set;}
public int DictValue {get;set;}
public DateTime Created{get;set;}
}
uzywam go jako DBSet<SomeModel>
Models
w tabeli mam wiele rekordow, gdzie SomeInt = 1, DictValue = 1, a chciałbym pobrać tylko ostatnio utworzony, czyli OrderByDescending(Created).Take(1)
ale... chce zbudować zapytanie z kolekcji, ktore by wygladalo mniej wiecej tak:
...where (SomeInt = queryParameters[0].someInt and DictValue = queryParameters[0].dictValue) or (SomeInt = queryParameters[1].someInt and DictValue = queryParameters[1].dictValue) ... or (SomeInt = queryParameters[10].someInt and DictValue = queryParameters[10].dictValue)
w metodzie otrzymuje te parametry i probuje:
public void SomeFunc(<int someInt, int dictVal>[] model)
{
var parameter = Expression.Parameter(typeof(SomeModel), "x");
var predicateExpressions = model.Select(element =>
Expression.AndAlso(
Expression.Equal(Expression.Property(parameter, nameof(SomeModel.SomeInt)), Expression.Constant(element.someInt)),
Expression.AndAlso(
Expression.Equal(Expression.Property(parameter, nameof(SomeModel.DictVal))
)
);
var orExpression = predicateExpressions.Aggregate(Expression.OrElse);
}
to jest chyba ok, ale musze jeszcze pogrupować po SomeInt i wziać pierwszy wynik w zależności od Created malejąco
i tutaj mam problem
spróbowałem tego co poniżej, ale to zapytanie leci 15 sekund do bazy ;D
var orderByExpression = Expression.Lambda<Func<SomeModel, DateTime>>(Expression.Property(parameter, "Created"), parameter);
var lambda = Expression.Lambda<Func<SomeModel, bool>>(orExpression, parameter);
var compiledLambda = lambda.Compile();
var lastUpdates = _context.SomeModel
.Where(compiledLambda)
.GroupBy(x => x.SomeInt)
.Select(g => g.OrderByDescending(x => x.Created).FirstOrDefault())
var result = (await _context.Models
.Where(x => lastUpdates.Contains(x.Id))
.ToListAsync())
male zastrzezenie - nie chcialbym uzywac jakis dodatkowyhc libek, ani raw sql w kodzie
znajdzie sie jakis dotnetnowy mocarz skory do pomocy ;) ?