partial void UpdateDenomLimit(DenomLimit instance)
{
var oldData = DataClassesDataContext.DenomLimits.Where(b => b.ID == instance.ID).First();
//Code that logs the audit when instance and oldData is passed to it
LogAudit(oldData, instance);
//Code that updates the instance
this.ExecuteDynamicUpdate(instance);
}
上面是一种更新数据库中DenomLimit实例的方法。 我正在记录对实体所做的更改的审核。为此,我通过以下代码获取实例的先前状态,并且它工作正常:
var oldData = DataClassesDataContext.DenomLimits.Where(b => b.ID == instance.ID).First();
现在我需要一个通用的LINQ查询,它可以在传递三个参数时获取oldData: 1.任何类型的实例 2.主键列名称 3.传递的实例的主键列值。
...以便我可以将该代码保存在LogAudit中,然后不需要获取每个函数。
LINQ查询,可能如下所示:
var oldData = DataClassesDataContext.GetTable<instance>().Where("b => b." + colName + " == @0", new object[] { id }).First();
答案 0 :(得分:0)
此处使用完整命名空间来表示它来自的命名空间,以便更容易合并到您的代码中。
public T GetFirstOrDefault<T>(System.Linq.Expressions.Expression<Func<T, bool>> func) where T : class
{
DataClassesDataContext.ObjectContext.CreateObjectSet<T>().FirstOrDefault(func);
// For EF 4.1 Code First
//return (ctx as System.Data.Entity.Infrastructure.IObjectContextAdapter).ObjectContext.CreateObjectSet<T>().FirstOrDefault(func);
// or
//return ctx.Set<T>().FirstOrDefault(func);
}
在这种情况下,使用Func的表达式可以让EF找出您要查找的数据。 以下是如何使用它的示例:
var a1 = GetFirstOrDefault<DenomLimits>(p => p.ID == oldData.ID);
var a2 = GetFirstOrDefault<DenomLimits>(p => p.OtherID == 5);