看下面的情景:
class CompanyDto {
public string Street { get; set;}
public int Number { get; set;}
public bool IsAttr1 { get; set;}
public bool IsAttr2 { get; set;}
public bool IsAttr3 { get; set;}
// Other not common Properties
}
class AnimalDto {
public string Street { get; set;}
public int Number { get; set;}
// Other not common Properties
}
class HouseDto {
public bool IsAttr1 { get; set;}
public bool IsAttr2 { get; set;}
public bool IsAttr3 { get; set;}
// Other not common Properties
}
class PersonDto {
public string Street { get; set;}
public int Number { get; set;}
public bool IsAttr1 { get; set;}
public bool IsAttr2 { get; set;}
public bool IsAttr3 { get; set;}
// Other not common Properties
}
我有这些要从 Entinty Framework 上下文中填充的 Dto。事情是我想使用标准 where 子句过滤结果。例子:
List<PersonDto> prs = context.Person.Where(x => x.Number == SomeValue && Street == SomeOtherValue).Where( x=> x.IsAttr1 || x.IsAttr2).Select(//projection here).ToList();
List<AnimalDto> anmls = context.Animal.Where(x => x.Number == SomeValue && Street == SomeOtherValue).Select(//projection here).ToList();
etc.
我想将它们投影到 Dtos(简单),但我不想一次又一次地编写 Where 子句。我尝试使用扩展方法来做到这一点,但是在使用基类(地址和标志)和使用接口时都失败了,因为 IQuerable 不能从接口转换为具体类。
有什么办法可以做到这一点吗?
最好的方法是使用这样的扩展方法:
public static IQueryable<IAddress> WhereAddress(this IQueryable<IAddress> qry, int SomeValue, int SomeOtherValue)
{
return qry.Where(x => x.Number == SomeValue && Street == SomeOtherValue);
}
但是我不能在 WhereAddress 子句和 IQuerable.cast(); 之后添加 WhereFlags;没有做演员。