2009-08-05 9 views
1

Ich frage mich, ob dieseLinq2Sql + SortiertNach String-Wert

var table = _db.GetTable<T>(); 
var data = table.Where(t => !t.Deleted).OrderBy("Name"); 

möglich ist, kann ich nicht t.Name tun als t nur Id und gelöscht haben

Die Basisklasse, die diese Methode wie diese

sieht enthält
public class RepositoryBase<T> where T : class, Interfaces.IModel 

IModel weiß nur von Deleted und Id

Grüße

+0

Warum gibt es keinen t.Name, wenn die Tabelle eine Namensspalte hat, nach der sortiert werden soll? – Blorgbeard

+0

ITs eine Basisklasse, dass public class RepositoryBase where T: Klasse, Interfaces.IModel Die Schnittstelle enthält nur gelöschte und Id wie alle Tische haben, dass –

Antwort

2

Es ist der zugrunde liegende Typ nicht haben eine offensichtliche Name Mitglied, das kann ich nicht sehen, wie das funktionieren würde.

Wenn das Problem ist einfach, dass Sie nur wissen, die Spalte zur Laufzeit zu bestellen; dann, um durch eine dynamische Eigenschaft zu bestellen, müssen Sie eine Expression on the fly bauen. Hier ist ein alter Code, den ich habe: "Name" und Dinge wie "Customer.Name" (untergeordnete Eigenschaften); Ich habe es in letzter Zeit nicht getestet, aber:

public static class OrderExtensions { 
    public static IOrderedQueryable<T> OrderBy<T>(this IQueryable<T> source, string property) 
    { 
     return ApplyOrder<T>(source, property, "OrderBy"); 
    } 
    public static IOrderedQueryable<T> OrderByDescending<T>(this IQueryable<T> source, string property) 
    { 
     return ApplyOrder<T>(source, property, "OrderByDescending"); 
    } 
    public static IOrderedQueryable<T> ThenBy<T>(this IOrderedQueryable<T> source, string property) 
    { 
     return ApplyOrder<T>(source, property, "ThenBy"); 
    } 
    public static IOrderedQueryable<T> ThenByDescending<T>(this IOrderedQueryable<T> source, string property) 
    { 
     return ApplyOrder<T>(source, property, "ThenByDescending"); 
    } 
    static IOrderedQueryable<T> ApplyOrder<T>(IQueryable<T> source, string property, string methodName) { 
     ParameterExpression arg = Expression.Parameter(typeof(T), "x"); 
     Expression expr = arg; 
     foreach(string prop in property.Split('.')) { 
      // use reflection (not ComponentModel) to mirror LINQ 
      expr = Expression.PropertyOrField(expr, prop); 
     } 
     Type delegateType = typeof(Func<,>).MakeGenericType(typeof(T), expr.Type); 
     LambdaExpression lambda = Expression.Lambda(delegateType, expr, arg); 

     return (IOrderedQueryable<T>) typeof(Queryable).GetMethods().Single(
       method => method.Name == methodName 
         && method.IsGenericMethodDefinition 
         && method.GetGenericArguments().Length ==2 
         && method.GetParameters().Length == 2) 
       .MakeGenericMethod(typeof(T), expr.Type) 
       .Invoke(null, new object[] {source, lambda}); 
    } 
} 
+0

+1 Excellent! Genau das, was ich brauchte. :) – magnus

0

Ich glaube, Sie brauchen eine bestimmte Repository für diese Entität, da Ihre Abstraktion Modell paßt nicht für diesen Fall zu erstellen. Etwas wie:

public class MyEntityRepository : RepositoryBase<MyEntity>