Это будет сложно, если типы объектов не будут реализовывать один и тот же интерфейс или получить один и тот же класс. Если они делают, это довольно просто:
// example base type, which your entities would need to implement
public interface IApprovable
{
public int ID {get; set;}
public string Approved_by {get; set;}
public DateTime Approved_on {get; set;}
}
//...
public void ApproveRowTable<T>(List<int> idValues)
where T : IApprovable
{
using(var context = new SSPModel.sspEntities())
{
var table = context.Set<T>();
var entities = table.Where(e => idValues.Contains(e.ID));
foreach(var entity in entities)
{
entity.Approved_by = GlobalClass.GlobalVar;
entity.Approved_on = DateTime.Now;
}
context.SaveChanges();
}
}
Если типы сущностей не реализуют общий базовый тип, то вы должны изменить их, создавая пустые партиалы у которых его реализации:
public partial class GeneralRule : IApprovable {}
Если вы не может этого сделать, тогда вы можете сделать что-то вроде следующего. (Я предполагаю, что ID
является ПК, так что мы можем использовать Find()
вместо необходимости создания выражения:
public void ApproveTableRows(Type entityType, IEnumerable<int> idsToApprove)
{
using(var context = new SSPModel.sspEntities())
{
var set = context.Set(entityType);
if(set == null)
throw new ArgumentException("No DbSet found with provided name", "tableSetName");
var approveByProperty = entityType.GetProperty("Approved_by");
var approveOnProperty = entityType.GetProperty("Approved_on");
if(approveByProperty == null || approveOnProperty == null)
throw new InvalidOperationException("Entity type does not contain approval properties");
foreach (object id in idsToApprove)
{
var entityInstance = set.Find(id);
approveByProperty.SetValue(entityInstance, GlobalClass.GlobalVar);
approveOnProperty.SetValue(entityInstance, DateTime.Now);
}
context.SaveChanges();
}
}
Как вы можете видеть, это менее эффективно, так как он выдает новый запрос для каждого идентификатора, а чем получение их всех одновременно. Кроме того, метод принимает объект Type
, а не строку, чтобы избежать необходимости выслеживать правильное свойство путем отражения. Это может быть улучшено, но на самом деле я думаю, что вам, вероятно, следует обновить свои сущности для реализации общий интерфейс.
У всех ваших объектов есть свойства 'ID',' Approved_by' и 'Approved_on'? Если да, наследуют ли они от базового абстрактного класса эти свойства? –
С динамическим запросом вы подразумеваете «Динамический LINQ» в качестве имени библиотеки или «Я бы хотел, чтобы мой запрос был динамическим»? – xanatos
Возможно, вы думаете «общий запрос»? Вы хотите использовать этот метод для разных типов (EF objects = tables)? –