[英]Generic Delete in Entity Framework
我有一个通用的删除方法DoDelete<MyTable>(int batchSize, MyDatabaseContext)
此方法将 ids ( List<int> deleteId
) 建立到批量计数,然后我喜欢调用
BulkDelete<T>(MyDatabaseContext, t => deleteId.Contains(t.RecordId))
但是,这种方法不起作用,因为它不知道<t>
具有属性RecordId
(即使它始终是RecordId
属性)。
我也试过:
int rows = BulkDelete<T>(MyDatabaseContext, "RecordId in (100001,100002)");
这是执行删除的实际方法,我还有一个接受字符串谓词的重载。
public int BulkDelete<T>(MyDatabaseContext context, Expression<Func<T, bool>> predicate)
where T : class
{
int rows = context.Set<T>().Where(predicate).Delete();
return rows;
}
正如@mason 所说,您可以使用所有实体实现的RecordId
属性创建一个接口,然后您的通用t=>deleteId.Contains(t.RecordId)
将编译:
// The interface
public interface IRecordIdEntity
{
int RecordId {get;set;}
}
// Sample Class
public class Person : IRecordIdEntity
{
// implement the interface
public int RecordId {get;set;}
}
// Generic BulkDelete for IRecordIdEntitys
public int BulkDelete<T>(MyDatabaseContext context, Expression<Func<T, bool>> predicate)
where T : IRecordIdEntity
{
int rows = context.Set<T>().Where(predicate).Delete();
return rows;
}
// Sample call
BulkDelete<Person>(MyDatabaseContext, person=> deleteId.Contains(person.RecordId))
由于BulkDelete()
仅限于处理实现IRecordIdEntity
的类型,因此谓词始终有效。
首先,您应该使用接口来处理:
public interface IEntity
{
long RecordId { get; set; }
}
然后你应该这样做,让每个其他实体对象(表)实现该接口:
//Example
public class Book : IEntity
{
public long RecordId { get; set; }
public string Name { get; set; }
public string Author{ get; set; }
}
之后,您可以轻松地向您的方法添加约束:
public int BulkDelete<T>(MyDatabaseContext context, Expression<Func<T, bool>> predicate)
where T : class, IEntity
{
int rows = context.Set<T>()
.Where(predicate).Delete();
return rows;
}
之后这个调用会很好,因为t
是IEntity
:
BulkDelete<T>(MyDatabaseContext, t=>deleteId.Contains(t.RecordId))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.