2014-02-01 2 views
0

У меня есть функция public, которая запрашивает конкретную сущность. Я хотел бы воспроизвести функцию для любой таблицы, в которой я проходил, но не знаю, как это сделать. Вот рабочая функция, которую я хочу сделать динамический:Как передать объект Entity объекту в 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); 
+1

Не могли бы вы создать интерфейс или родительский класс, чтобы все таблицы, реализующие 'LastUpdated', и объявили ли они там? –

+0

@Scott Chamberlain, я не уверен, что понимаю, что вы здесь говорите. Можете ли вы объяснить концепцию немного больше, пожалуйста? –

+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 свойство.

+0

+1 для работоспособного решения. Основным недостатком этого для меня является отсутствие рефакторинга из-за жестко заданного имени свойства LastUpdated. –

+0

@Oleksii Aza, я смог получить эту работу. Причина жесткого кодирования заключается в том, что я планирую добавить поле временной метки (называемое LastUpdated) ко всем потенциальным таблицам поиска, и это позволит мне хранить содержимое таблицы вместе с их максимальным значением LastUpdated в локальном хранилище и выполнять только вызов ajax чтобы освежить их в случайные моменты времени, когда они меняются. Поле timestamp на самом деле не является DateTime, а бинарным полем, которое просто увеличивается на единицу при каждом изменении таблицы. Вот почему я действительно не рассматривал ваше решение, но спасибо за помощь. –

+1

@AlanFisher. Вы все еще можете сделать свое решение, вы просто сделаете 'byte [] LastUpdated {get; set;}' в интерфейсе. Я только выяснил тип 'LastUpdated' в моем ответе, потому что' byte [] 'является единственной вещью, которую должен использовать битконвертер. –

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

UPDATE: Кроме того, вы бы рассмотреть возможность использования его в качестве метода расширения:

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(); 
Смежные вопросы