So bin ich etwas müde von immer wieder die gleichen Abfragen umschreiben.Erweitern IQueryable mit IsInDateTimeRange
repo.Query().Where(stuff => stuff.Timestamp >= minTime && stuff.Timestamp <= maxTime && ...);
Ich dachte, ich IQueryable
mit einem Verfahren IsInDateTimeRange
erweitern sollte aufgerufen, und es verwenden, wie diese
repo.Query().IsInDateTimeRange(stuff => stuff.Timestamp, minTime, maxTime) ...
dies für IEnumerable
sehr einfach wäre, nur Func<T, DateTime>
und zwei DateTime
s, jedoch für die IQueryable
Ich muss ein Expression
nehmen und ich bin nicht wirklich sicher, wie man das benutzt.
Das war mein Versuch, aber scheint nicht zu funktionieren.
public static IQueryable<TValue> IsInDateTimeRange<TValue>(
this IQueryable<TValue> self,
Expression<Func<TValue, DateTime>> getMember,
DateTime minTime,
DateTime maxTime)
{
return self.Where(value => minTime >= getMember(value) && maxTime <= getMember(value));
}
Wenn Sie nicht sagen, arbeiten Sie bitte erklären, was es bedeutet. Ausnahme? Kompilierfehler? .. –
Die meisten Linq-Provider konnten Ihren transformierten Ausdruck aufgrund dieses 'getMember (value)' noise nicht in eine Speicherabfrage übersetzen. Sie müssen die relevanten Teile manuell durch einen regulären "Expression.Property" -Accessor ersetzen. – haim770
Ja, Compilerfehler. getMember kann nicht aufgerufen werden, da es sich nicht um einen Delegaten handelt. – jool