0
public void ApproveRowTable(string tablename, List<int> idValues)
{
    foreach (var x in idValues)
    {
            var context = new SSPModel.sspEntities();
            var genRules = (from a in context.GeneralRules
                            where a.ID == x 
                            select a).SingleOrDefault();
            genRules.Approved_by = GlobalClass.GlobalVar;
            genRules.Approved_on = DateTime.Now;
            context.SaveChanges();
    }
}

在我的查询(from a in context.GeneralRules...)中,我想让它基于一个参数(表名)进行查询,而不是我必须在查询中提供表的名称(就像它现在所做的那样。)。任何我可以让它做到这一点的方法..基本..从一个 incontext.TABLENAME -- TABLENAME是一个参数,当函数被调用时将被传递。帮助

4

2 回答 2

1

如果您的实体类型并非都实现相同的接口或派生自相同的类,这将很困难。如果他们这样做,那很简单:

// 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是 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 发出一个新查询,而不是一次获取所有 ID。此外,该方法接受实体Type而不是字符串,以避免需要通过反射来寻找正确的属性。这可以改进,但实际上我认为您应该更新您的实体以实现共享接口。

于 2013-08-28T00:46:49.663 回答
0

我假设您希望该方法具有通用性。当您使用 EF 时,所有表都表示为对象,因此您不必按名称指定所需的表,只需使用通用参数即可。

我怀疑我的解决方案是最好的,但它应该有效。但是我必须警告你,反射很慢,而且很多时候它的用法是不正确的。

public void ApproveRowTable<T>(List<int> idValues)
{
    var context = new SSPModel.sspEntities();
    var table = context.GetType().GetProperties().OfType<T>().Single();
    var genRules = (from a in table
                            where a.ID == x 
                            select a).SingleOrDefault();
            genRules.Approved_by = GlobalClass.GlobalVar;
            genRules.Approved_on = DateTime.Now;
            context.SaveChanges();
}
于 2013-08-27T14:40:30.617 回答