用于根据类型搜索LINQ实体的泛型方法

时间:2011-10-11 07:40:00

标签: linq generics

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

1 个答案:

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