Ich schrieb eine Methode, um einen Ausdruck für die Orderby-Klausel übergeben zu können, aber ich lief auf dieses Problem.Entity Framework: LINQ to Entities unterstützt nur Casting Entity Data Model primitive Typen
nicht Art 'System.DateTime' gießen 'System.IComparable' einzugeben. LINQ to Entities unterstützt nur Casting Entity Data Modell primitive Typen.
Grundsätzlich ist der Ausdruck, ist dies:
Expression<Func<K, IComparable>> orderBy
Und wie diese genutzt werden:
SomeEntities.SomeTable
.Where
(
whereClause
)
.Select
(
selectClause
)
.OrderBy(orderBy)
Die Idee ist so, dass ich ein Wörterbuch verwenden kann, wie Zeichenfolge entspricht, um Ausdrücke zu halten:
_possibleSortForForumItem.Add("CreateDate", item => item.CreateDate);
Dann habe ich eine Methode, die dauert in der Sortierzeichenfolge und gibt den Ausdruck zurück, wenn er mit einem Schlüssel im Wörterbuch übereinstimmt, wenn nicht ein Standardwert zurückgegeben wird. (Die Idee ist eine Möglichkeit, zu kontrollieren, was es zu ordnen ist) Nun funktioniert dies für String-Eigenschaften, aber bisher nicht für Datetime oder Integer, da ich die obige Fehlermeldung bekomme.
Soweit ich (lose) verstehe das Problem ist, dass Entity Framework es ein primärer/EDM-Typ sein muss, weil es die C# DateTime in etwas konvertieren muss, die die Datenbank verarbeiten kann.
Gibt es eine Möglichkeit, die Datetime in einen primitiven Typ zu konvertieren, so dass dies noch funktioniert?
Lösung
Verfahren für den Auftrag durch Verfahren erhalten: (Nehmen Sie in einer Abfrage und senden Sie es in „geordneter Form“)
private static Func<IQueryable<ForumViewItem>, IOrderedQueryable<ForumViewItem>> GetMethodForSort(String sortBy)
{
if (_methodForSort == null)
{
_methodForSort = new Dictionary<String, Func<IQueryable<ForumViewItem>, IOrderedQueryable<ForumViewItem>>>();
_methodForSort.Add(SortForumViewItemCreatedOn, item => item.OrderBy(innerItem => innerItem.CreatedOn));
...
}
Func<IQueryable<ForumViewItem>, IOrderedQueryable<ForumViewItem>> orderMethod;
if(String.IsNullOrEmpty(sortBy) || !_methodForSort.ContainsKey(sortBy))
{
orderMethod = _methodForSort["ForumName"];
}
else
{
orderMethod = _methodForSort[sortBy];
}
return orderMethod;
}
Die Methodensignatur für die generische Abfrage-Methode:
IList<K> GetListForGrid<T, K>(this ObjectQuery<T> query, ... Func<IQueryable<K>, IOrderedQueryable<K>> orderBy, ...)
Und die Verwendung der in Methode übergeben:
initialQuery = query
.Where
(
somethingEqualsSomething
)
.Select
(
selectClause
);
var orderedQuery = orderBy(initialQuery);
returnValue = orderedQuery
.Skip(numberToShow * realPage)
.Take(numberToShow)
.ToList();
Ich würde vorschlagen, ein IOrderedQueryable als Ergebnis der Func, dies wird zur Kompilierzeit eine OrderBy wird verwendet, weil zum Beispiel Paging nicht geordnete Abfragen nicht mögen. –
Davy, Einverstanden. Ich habe den Code geändert, um dies zu berücksichtigen. –
Ich brauchte ein paar Minuten, um herauszufinden, wie man das macht, aber am Ende ist es sehr praktikabel. –