如果您的實體類型不是全部實現相同的接口或從相同的類派生,這將是困難的。如果他們這樣做,這是很簡單的:
public partial class GeneralRule : IApprovable {}
如果您:
// 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();
}
}
如果實體類型不實現一個共同的基本類型,那麼你應該通過創建國家執行它的空諧音修改它們不能這樣做,那麼你可以做下面的事情。 (我假設ID
是PK,所以我們可以使用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();
}
}
正如你所看到的,這是效率較低,因爲它會發出一個新的查詢每個ID而這個方法可以接受一個實體Type
而不是一個字符串,以避免需要通過反射尋找正確的屬性,這可以得到改善,但我想你應該更新你的實體來實現一個共享的接口
所有的實體是否都具有屬性'ID','Approved_by'和'Approved_on'?如果是,他們是否繼承了這些屬性的基本抽象類? –
使用動態查詢時,您的意思是「動態LINQ」作爲庫的名稱或「我希望我的查詢是動態的」? – xanatos
你也許認爲「通用查詢」?您是否想將這種方法用於許多不同類型(EF對象=表格)? –