簡體   English   中英

如何將實體對象傳遞給C#中的函數

[英]How do I pass an Entity Object to a function in C#

我有一個查詢特定實體的公共功能。 我想為傳入的任何表復制該函數,但不知道如何。 這是我要動態化的工作功能:

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); 

在不更改任何現有類的情況下(如果可以的話,請參見Oleksii的答案 ),最簡單的方法是手動創建表達式樹並讓其選擇所需的屬性。

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屬性的表,則此操作將在運行時失敗。

我認為您應該使用這樣的界面標記您的實體:

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();

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM