如何将实体对象传递给C#中的函数

时间:2014-02-01 20:39:56

标签: c# linq entity-framework

我有一个查询特定实体的公共函数。我想复制我传入的任何表的函数,但不知道如何。这是我想要动态的工作函数:

public string MaxDepartment()
    {
        CPLinkEntities _context = new CPLinkEntities();
        results = _context.LOG_Departments.Max(t => t.LastUpdated); // hard coded
        string hex = BitConverter.ToString(results);
        hex =  hex.Replace("-", "");
        return hex;
    }

我真的想在这里做的是传递一个实体进行查询。所有实体都有时间戳。这是我想象它会是什么但不起作用:

 public string MaxDepartment(CPLinkEntities tableName)
    {

        var results = tableName.Max(t => t.LastUpdated);
        string hex = BitConverter.ToString(results);
        hex =  hex.Replace("-", "");
        return hex;
    }

从控制器调用该函数将是:

CPLinkEntities context = new CPLinkEntities();
var tableName = context.LOG_Departments;
var maxDept = cf.MaxDepartment(tableName); 

2 个答案:

答案 0 :(得分:2)

在不更改任何现有类的情况下执行此操作的最简单方法(如果可以,请参阅Oleksii's answer)是手动创建表达式树并让它选择所需的属性。

public static string MaxDepartment<U>(IQueryable<U> table)
{
    var parameter = Expression.Parameter(typeof(U));
    var property = Expression.Property(parameter, "LastUpdated");
    var lambada = Expression.Lambda<Func<U, byte[]>>(property, parameter);

    var results = table.Max(lambada);
    string hex = BitConverter.ToString(results);
    hex = hex.Replace("-", "");
    return hex;
}

你可以通过

来调用它
using(CPLinkEntities _context = new CPLinkEntities()) //You forgot to dispose in your original example
{
    var max = MaxDepartment(_context.LOG_Departments);

    //Do whatever you want with max here.
}

如果您尝试传入一个没有LastUpdated属性的表,这将在运行时失败。

答案 1 :(得分:1)

我认为你应该用这样的界面标记你的实体:

public interface ILastUpdatable
{
   byte[] LastUpdated {get;set;}
}

public partial class LOG_Departments : ILastUpdatable
{
}

然后让你的方法期望一个类型的对象实现这样的接口:

public string MaxDepartment<TLastUpdatable>(IQueryable<TLastUpdatable> updatables)
  where TLastUpdatable : class, ILastUpdatable
{
    var results = updatables.Max(t => t.LastUpdated);
    string hex = BitConverter.ToString(results);
    hex =  hex.Replace("-", "");
    return hex;
}

更新: 您也可以考虑将其用作扩展方法:

public static class MaxUpdatableExtensions
{
    public static string MaxDepartment<TLastUpdatable>(this IQueryable<TLastUpdatable> updatables)
      where TLastUpdatable : class, ILastUpdatable
    {
        var results = updatables.Max(t => t.LastUpdated);
        string hex = BitConverter.ToString(results);
        hex =  hex.Replace("-", "");
        return hex;
    }
}

并将其称为:

CPLinkEntities _context = new CPLinkEntities();
var results = _context.LOG_Departments.MaxDepartment();