3

基本クラスと継承クラスがあるとします

public class BaseClass
{
    public String SystemName { get; set; }
    public String UserName { get; set; }
}

internal class InheritedClass : BaseClass
{
    public Guid Id { get; set; }        
}

基本クラスの式が外部からモジュールに渡されます (継承されたクラスはそこから見えません)

Expression<Func<BaseClass, bool>>

たとえば、そのようないくつかのフィルタリングロジックについて説明します

Expression<Func<BaseClass, bool>> filter = x => x.SystemName.StartsWith("ABC") && x.UserName != ""

しかし、モジュール内で使用する必要があります

Expression<Func<InheritedClass, bool>>

このフィルターをIQueryableに適用するので、そのように

IQueryable<InheritedClass> filteredItems = Items.Where(filter);

継承されたクラスには基本クラスのすべてのプロパティがあります-したがって、あまり経験のない私の心は、変換が可能であると仮定します:)

渡された式を必要なものに変換する方法はありますか?

ありがとうございました。

4

1 に答える 1

0

このユーティリティ クラスを使用します

public static class Utility
{
    //public static IEnumerable<TTarget> Where<TSource, TTarget>(this IEnumerable<TSource> source, Expression<Func<TSource, bool>> predicate) where TTarget : class, TSource
    //{
    //     return source.Where(obj => obj is TTarget).Where(predicate.Compile()).Select(obj => obj as TTarget);
    //}

    public static IQueryable<TTarget> Where<TSource, TTarget>(this IQueryable<TSource> source, Expression<Func<TSource, bool>> predicate) where TTarget : class, TSource
    {
        return source.Where(obj => obj is TTarget).Where(predicate).Select(obj => obj as TTarget);
    }
}

例はこのようなもので、スーパークラスとサブクラスは次のようになります

class Person
{
    public String Name { get; set; }
    public ushort Age { get; set; }
}

class Student : Person
{
    public String StudentId { get; set; }
}

class Teacher : Person
{
    public String TeacherId { get; set; }
}

ユーティリティを使用してテストする

            /*List of Persons*/
            List<Person> persons = new List<Person>()
                                                          {
                                                              new Student(){StudentId = "Std-01", Name = "Roy", Age = 24},
                                                              new Student(){StudentId = "Std-02", Name = "Jhon", Age = 25},
                                                              new Teacher(){TeacherId = "Tch-01", Name = "Roy", Age = 24},
                                                              new Teacher(){TeacherId = "Tch-02", Name = "Jhon", Age = 25}
                                                          };
            /*predictions*/
            Expression<Func<Person, bool>> prediction = x => x.Name.Contains("o");


            /*Use the utility*/
                                                                    /*Get Teacher from Persons*/
            IQueryable<Teacher> filteredItems = persons.AsQueryable().Where<Person, Teacher>(prediction);
            List<Teacher> result = filteredItems.ToList();

その結果、TeacherId="Tch-01" And "Tch-02" を持つ教師を取得します

IQueryableではなくIEnumerableで作業しましたが、役に立てば幸いです

于 2013-11-04T12:30:09.103 に答える