首先要么定义一个它们都派生自的基类,要么定义一个它们都实现的接口。我将从这里假设他们实现了一个带有Colour 属性的IColoured 接口。 (虽然我会注意到在成员名称中使用 en-US 很常见,因此颜色由 Color 属性表示)。
假设您的 Cars 类是由 EF 创建的:
namespace SomeNamespace
{
public partial class Cars
{
/*…*/
public string Colour { get; set; }
/*…*/
}
}
然后你可以有一个文件:
namespace SomeNamespace
{
public partial class Cars : IColoured
{
}
}
因为在编译类定义时将两个partial 代码组合在一起,您的代码只需要表明接口已实现,匹配属性在另一个文件中的事实并不重要。
然后:
public static IQueryable<T> FilterByColour<T>(this IQueryable<T> source, string colour)
where T : IColoured
{
return source.Where(p => p.Colour == colour);
}
现在您可以使用_Entities.Cars.FilterByColour("white")、_Entities.Bikes.FilterByColour("blue") 等。如果通过"white" 过滤是一种特别常见的情况,那么:
重要提示:如果您没有充分的理由(例如使用与 EF 不兼容的东西),切勿将这种方法定义为采用 IEnumerable<>,请使用 @ 987654332@ 所以它仍在由 EF 处理并且可以在数据库中进行过滤,而不是从数据库中检索所有内容并在您的应用程序中进行过滤。
public static IQueryable<T> FilterWhite<T>(this IQueryable<T> source)
where T : IColoured
{
return source.FilterByColour("white");
}
或者,如果您对 FilterByColour 没有其他用途,那么:
public static IQueryable<T> FilterWhite<T>(this IQueryable<T> source)
where T : IColoured
{
return source.Where(p => p.Colour == "white");
}
会工作的。