C# 创建泛型函数以筛选具有相同基类的多个对象
我正在尝试创建一个通用函数来传递我打算用于项目中许多对象的过滤器。所有这些对象都有一个名为C# 创建泛型函数以筛选具有相同基类的多个对象,c#,entity-framework,linq,inheritance,C#,Entity Framework,Linq,Inheritance,我正在尝试创建一个通用函数来传递我打算用于项目中许多对象的过滤器。所有这些对象都有一个名为BaseObject的基类 例如: public class Artist : BaseObject { public string Name { get; set; } //...more properties } public class Album : BaseObject { public string Title { get; set; } //...more p
BaseObject
的基类
例如:
public class Artist : BaseObject
{
public string Name { get; set; }
//...more properties
}
public class Album : BaseObject
{
public string Title { get; set; }
//...more properties
}
BaseObject具有以下功能:
public class BaseObject
{
public BaseObject()
{
Oid = Guid.NewGuid();
}
[Key]
public Guid Oid { get; set; }
[ScaffoldColumn(false)]
public DateTime? DateCreated { get; set; }
[ScaffoldColumn(false)]
public DateTime? DateUpdated { get; set; }
[ScaffoldColumn(false)]
public DateTime? DateDeleted { get; set; }
[ScaffoldColumn(false)]
public bool IsDeleted { get; set; }
}
我想创建一个可用于艺术家和专辑的方法,我有以下内容,但不起作用,我不理解
我得到一个错误:
“BaseObject”不包含“Name”的定义,并且找不到接受“BaseObject”类型的第一个参数的扩展方法“Name”(是否缺少using指令或程序集引用?)
我确信这是一个简单的修复,但我对LINQ和诸如此类的东西还不熟悉。您需要约束泛型参数以从
BaseObject
继承,并将其用作扩展方法的输入和输出
public static IQueryable<T> WhereActive<T>(this IQueryable<T> query)
where T: BaseObject
{
return query.Where(b => !b.IsDeleted);
}
公共静态IQueryable where活动(此IQueryable查询)
其中T:BaseObject
{
返回query.Where(b=>!b.IsDeleted);
}
您需要返回IQueryable
,并在T
上有一个通用约束,以指定它是一个实体.Core.BaseObject
(或从中派生的类)
公共静态IQueryable where活动(此IQueryable查询)
其中T:Entities.Core.BaseObject
{
//这里也不需要指定泛型。。。
返回query.Where(b=>!b.IsDeleted);
}
噢,要是我少写一点文字就好了:-)@ZoharPeled我知道。。我们相隔几秒钟:)
Artist artist = db.Artist
.WhereActive<Artist>()
.Where(a => string.IsNullOrEmpty(a.Name.Trim()))
.FirstOrDefault();
public static IQueryable<T> WhereActive<T>(this IQueryable<T> query)
where T: BaseObject
{
return query.Where(b => !b.IsDeleted);
}
public static IQueryable<T> WhereActive<T>(this IQueryable<T> query)
where T : Entities.Core.BaseObject
{
// no need to specify the generic <T> here as well...
return query.Where(b => !b.IsDeleted);
}