Vra

Geïnspireer deur die MVC-winkelfront is die nuutste projek waaraan ek werk, die gebruik van uitbreidingsmetodes op IQueryable om resultate te filter.

Ek het hierdie koppelvlak;

IPrimaryKey
{
  int ID { get; }
}

en ek het hierdie uitbreidingsmetode

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

Kom ons sê ek het 'n klas, SimpleObj wat IPrimaryKey implementeer.Wanneer ek 'n IQueryable van SimpleObj het, bestaan ​​die GetByID-metode nie, tensy ek eksplisiet uitstuur as 'n IQueryable van IPrimaryKey, wat minder as ideaal is.

Mis ek iets hier?

Was dit nuttig?

Oplossing

Dit werk, as dit reg gedoen word.cfeduke se oplossing werk.Jy hoef egter nie die IPrimaryKey koppelvlak generies, om die waarheid te sê, jy hoef glad nie jou oorspronklike definisie te verander nie:

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

Ander wenke

Wysig: Konradse oplossing is beter, want dit is baie eenvoudiger.Die onderstaande oplossing werk maar word slegs vereis in situasies soortgelyk aan ObjectDataSource waar 'n metode van 'n klas deur refleksie herwin word sonder om in die erfenishiërargie op te stap.Dit gebeur duidelik nie hier nie.

Dit is moontlik, ek moes 'n soortgelyke patroon implementeer toe ek 'n pasgemaakte entiteitsraamwerkoplossing ontwerp het om met ObjectDataSource te werk:

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; }
}

Brokkie van gebruik:

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

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

Dit kan nie werk nie as gevolg van die feit dat generiese medisyne nie die vermoë het om oorerwingspatrone te volg nie.dws.IQueryable<SimpleObj> is nie in die oorerwingsboom van IQueryable<IPrimaryKey>

Gelisensieer onder: CC-BY-SA met toeskrywing
Nie verbonde aan StackOverflow
scroll top