使用泛型的列的最大值

时间:2017-09-13 09:27:29

标签: c# linq generics lambda generic-programming

我正在开展一个项目。它正在关注"工作单位"我想写一个动态方法,我将传递表名,它将返回主键列的最大值,或者我将传递表和列名称,它将返回该列的最大值。它看起来像这样 -

public int GetMaxPK<T>()
{
    GetMaxId= ??
    return GetMaxId;
}

有可能吗?我怎样才能做到这一点?还是有什么建议吗?

3 个答案:

答案 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是我的查询列的数据类型。