Pertanyaan Metode repositori menerima predikat dan orderby


Saya telah menyiapkan repositori dengan Entity Framework dan memiliki metode antarmuka berikut:

Task<IList<Person>> SearchForPeople(Expression<Func<Person, bool>> predicate, Expression<Func<Person, object>> orderBy);

Ini cukup mendasar, dan saya telah menerapkannya sebagai:

public async Task<IList<Person>> SearchForPeople(Expression<Func<Person, bool>> predicate, Expression<Func<Person, object>> orderBy)
{
    return await this.context.People.Where(predicate).OrderBy(orderBy).ToListAsync();
}

Saya saat ini menyebutnya seperti ini:

var people = await repository.SearchForPeople(x => x.Born.Day == now.Day && x.Born.Month == now.Month, x => x.OrderingKey);

Yang mengembalikan semua orang yang tanggal lahirnya jatuh pada hari / bulan tertentu, lalu memesannya sesuai dengan properti yang disebut "orderingKey" yang pada dasarnya adalah nama mereka yang digabungkan.

Ini berfungsi dengan baik, tetapi jika saya mencoba mengubah orderby menjadi sesuatu seperti ini:

var people = await repository.SearchForPeople(x => x.Born.Day == now.Day && x.Born.Month == now.Month, x => x.Born);

Saya mendapatkan kesalahan yang mengatakan bahwa saya tidak dapat mentransmisikan System.DateTime ke System.Object. Saya mengerti mengapa hal ini terjadi karena saya telah dengan jelas menyatakan bahwa properti orderby harus memiliki tipe "objek", tetapi saya tidak dapat melihat bagaimana menulis ulang ini sehingga orderby saya menerima semua jenis properti untuk orderby tanpa menulis ulang semuanya menggunakan generic T, yang saya tidak benar-benar ingin lakukan karena saya tidak ingin repositori generik hanya filter generik!

Apakah ada cara lain untuk membuat kedua jenis pekerjaan orderby?


4
2018-05-21 09:16


asal


Jawaban:


Anda dapat membuat metode itu hanya umum:

public async Task<IList<Person>> SearchForPeople<T>(Expression<Func<Person, bool>> predicate, Expression<Func<Person, T>> orderBy)
{
    return await this.context.People.Where(predicate).OrderBy(orderBy).ToListAsync();
}

Kemudian menggunakan inferensi jenis, hal berikut seharusnya berfungsi:

var people = await repository.SearchForPeople(x => x.Born.Day == now.Day && x.Born.Month == now.Month, x => x.Born);

4
2018-05-21 10:16



Coba ini:

public async Task<IList<Person>> SearchForPeople<TOrderKey>(Expression<Func<Person, bool>> predicate, Expression<Func<Person, TOrderKey>> orderBy)
{
    return await this.context.People.Where(predicate).OrderBy(orderBy).ToListAsync();
}

Alih-alih lewat di "Objek" Anda mendefinisikannya sebagai parameter generik.


1
2018-05-21 10:35