我正在开展一个项目。它正在关注"工作单位"我想写一个动态方法,我将传递表名,它将返回主键列的最大值,或者我将传递表和列名称,它将返回该列的最大值。它看起来像这样 -
public int GetMaxPK<T>()
{
GetMaxId= ??
return GetMaxId;
}
有可能吗?我怎样才能做到这一点?还是有什么建议吗?
答案 0 :(得分:2)
您可以使用一个属性定义interface:
public interface IMax
{
int Id { get; set; }
}
然后你的泛型类应该实现这个接口:
public class yourClass<T> where T : class , IMax
最后:
public int GetMaxPK()
{
GetMaxId= yourTable.Max(c => c.Id);
return GetMaxId;
}
您的完整代码应该是这样的:
public class yourClass<T> where T : class, IMax
{
public int GetMaxPK(IEnumerable<T> yourTable)
{
var GetMaxId = yourTable.Max(c => c.Id);
return GetMaxId;
}
}
答案 1 :(得分:1)
您可以考虑使用与Max扩展方法类似的东西
TResult Max<TSource, TResult>(this IEnumerable<TSource> source, Func<TSource, TResult> selector);
哪适用于你的场景
public int GetMaxPK<TTable>(IEnumerable<TTable> table, Func<TTable, int> columnSelector) {
var maxId= table.Max(columnSelector);
return maxId;
}
或者假设源已经是封装类的内部,例如DbContext
DbContext db;
//...
public int GetMaxPK<TTable>(Func<TTable, int> columnSelector) {
var maxId = db.Set<TTable>().Max(columnSelector);
return maxId;
}
并称之为
var maxId = myClass.GetMaxPK<TableName>(t => t.PKColumnName);
答案 2 :(得分:1)
在我的项目中,我在mvc控制器中编写了这样的maxId -
public class PurchaseOrderController : Controller
{
private IPurchaseOrder interfaceRepository;
public PurchaseOrderController()
{
if (interfaceRepository==null)
{
this.interfaceRepository= new Repository();
}
}
int maxId=interfaceRepository.GetMaxPK(a=>a.POMSTID);
}
这里
A =&GT; a.POMSTID
是要查询的colum选择器。假设您要选择名为&#34; PODETID&#34;的列。列选择器将是这样的 -
A =&GT; a.PODETID
现在在界面 -
public interface IPurchaseOrder:IRepository<PURCHASEORDERMASTER>
{
}
在这里&#34; PURCHASEORDERMASTER&#34;是我的查询表或TEntity。
public interface IRepository<TEntity> where TEntity : class
{
int GetMaxPK(Func<TEntity, decimal> columnSelector);
}
现在在您调用数据库的存储库(或具体)类(继承接口)中,您必须这样写 -
public class Repository<TEntity> : IRepository<TEntity> where TEntity : class
{
public int GetMaxPK(Func<TEntity, decimal> columnSelector)
{
var GetMaxId = db.Set<TEntity>().Max(columnSelector);
return GetMaxId;
}
}
这里db是数据库上下文,decimal是我的查询列的数据类型。