C# 如何转换表达式<;Func<;基本类,bool>&燃气轮机;表达<;Func<;继承类,bool>>;?
假设我有一个基类和继承类C# 如何转换表达式<;Func<;基本类,bool>&燃气轮机;表达<;Func<;继承类,bool>>;?,c#,inheritance,expression,C#,Inheritance,Expression,假设我有一个基类和继承类 public class BaseClass { public String SystemName { get; set; } public String UserName { get; set; } } internal class InheritedClass : BaseClass { public Guid Id { get; set; } } 基类上的某个表达式从外部传递到我的模块(继承的类从那里不可见) 表达式
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>> filter = x => x.SystemName.StartsWith("ABC") && x.UserName != ""
IQueryable<InheritedClass> filteredItems = Items.Where(filter);
Expression filter=x=>x.SystemName.StartsWith(“ABC”)和&x.UserName!=""
但在我的模块中,我需要使用
Expression<Func<InheritedClass, bool>>
表达式
因为我将此筛选器应用于IQueryable,如下所示
Expression<Func<BaseClass, bool>> filter = x => x.SystemName.StartsWith("ABC") && x.UserName != ""
IQueryable<InheritedClass> filteredItems = Items.Where(filter);
IQueryable filteredItems=Items.Where(filter);
继承的类具有基类的所有属性-所以我的经验不太丰富,假设转换是可能的:)
有没有办法将传递的表达式转换为我需要的
谢谢。使用此实用程序类
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);
}
}
使用该实用程序并对其进行测试
/*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();
/*人员名单*/
名单人员=新名单()
{
新学生(){StudentId=“Std-01”,Name=“Roy”,年龄=24},
新学生(){StudentId=“Std-02”,Name=“Jhon”,年龄=25},
新教师(){TeacherId=“Tch-01”,Name=“Roy”,年龄=24},
新教师(){TeacherId=“Tch-02”,Name=“Jhon”,年龄=25}
};
/*预言*/
表达式prediction=x=>x.Name.Contains(“o”);
/*使用该实用程序*/
/*从人那里得到老师*/
IQueryable filteredItems=persons.AsQueryable()。其中(预测);
列表结果=filteredItems.ToList();
结果,我们将得到教师ID=“Tch-01”和“Tch-02”的教师
尽管我使用的是IEnumerable而不是IQueryable,但我希望它能对我有所帮助。不知道正确的搜索短语:)它很可能是出于某种原因应用于IQueryable,原因通常是表达式被翻译成SQL或类似的语言,所以调用compile可能会违背intention@RuneFS:我认为其意图是使用提供的表达式从列表中获取列表,因此制作了这样的示例。但是,似乎主要的过程要求将表达式转换为表达式,因为误解而非常抱歉。是的,我的观点是,在问题中明确指出它是Iqueryable“因为我将此过滤器应用于Iqueryable,就像这样”现在我的问题是,您将提供表达式,并且Iqueryable,我想买一台IQueryable。我是否遗漏了一些不是问题的东西,但这似乎是一个毫无意义的讨论。问题已经结束,因为它已经被回答了,我们正在辩论一个与已经回答的问题相符的答案