Domanda

Ispirato MVC storefront l'ultimo progetto a cui sto lavorando è utilizzando i metodi di estensione su IQueryable per filtrare i risultati.

Ho questa interfaccia;

IPrimaryKey
{
  int ID { get; }
}

e ho questo metodo di estensione

public static IPrimaryKey GetByID(this IQueryable<IPrimaryKey> source, int id)
{
    return source(obj => obj.ID == id);
}

Diciamo che ho una classe, SimpleObj che implementa IPrimaryKey.Quando ho un IQueryable di SimpleObj il GetByID un metodo che non esiste, a meno che non esplicitamente un cast IQueryable di IPrimaryKey, che è meno che ideale.

Mi manca qualcosa qui?

È stato utile?

Soluzione

Funziona, se fatto nel modo giusto.cfeduke la soluzione funziona.Tuttavia, non è necessario per rendere il IPrimaryKey interfaccia generica, in realtà, non è necessario modificare la definizione originale a tutti:

public static IPrimaryKey GetByID<T>(this IQueryable<T> source, int id) where T : IPrimaryKey
{
    return source(obj => obj.ID == id);
}

Altri suggerimenti

Edit: Konrad's la soluzione migliore, perché la sua molto più semplice.Il seguente soluzione funziona, ma solo in situazioni simili a ObjectDataSource dove un metodo di una classe viene recuperato attraverso la riflessione senza risalendo la gerarchia di ereditarietà.Ovviamente qui non funziona.

Questo è possibile, ho dovuto implementare un modello simile quando ho progettato un custom entity framework soluzione per lavorare con ObjectDataSource:

public interface IPrimaryKey<T> where T : IPrimaryKey<T>
{
    int Id { get; }
}

public static class IPrimaryKeyTExtension
{
     public static IPrimaryKey<T> GetById<T>(this IQueryable<T> source, int id) where T : IPrimaryKey<T>
     {
         return source.Where(pk => pk.Id == id).SingleOrDefault();
     }
}

public class Person : IPrimaryKey<Person>
{
    public int Id { get; set; }
}

Frammento di utilizzo:

var people = new List<Person>
{
    new Person { Id = 1 },
    new Person { Id = 2 },
    new Person { Id = 3 }
};

var personOne = people.AsQueryable().GetById(1);

Questo non può lavorare a causa del fatto che i farmaci generici non hanno la capacità di seguire modelli di ereditarietà.ie.IQueryable<SimpleObj> non è nella struttura di ereditarietà della IQueryable<IPrimaryKey>

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top