使用泛型函数查询EF5中的DBSet
我看到了DbSet的各种实现,但我不确定它们是我正在寻找的。使用泛型函数查询EF5中的DBSet
基本上我们有一堆通过EF5 Code First方法设置的DbSet。我有一个编写代码的任务,根据我们在数据库中已有的记录来检查进入API的任何更新/帖子,以确保它们只有在新记录时才更新/张贴。
显然我不想为每个这些DBSet编写相同的代码,我想编写一个类/函数,它将能够将DbSet作为参数/参数,然后检查DBSet作为记录。它必须是动态的,因为它是依赖于最终用户和他们在做什么哪个DbSet将需要查询...
因此,例如,我想要做的事,如呼叫:
CheckDbUniqueRecord(Contracts)
其中合同是从表单传入的合同模型的DbSet。
所以在这个模型中,我们有public class Contract
,并在MainDbContext我们有多个DbSet的其中之一是public DbSet<Contract> Contracts {get; set;}
我希望能够运行相同的代码来检查任何重复记录的DbSets我们通过简单地传递从该特定的控制器返回的类/模型与该一行功能...
我知道有一种方法来实现这一点,但我不断收到错误消息/类型来自C#的错误表明类型不匹配,等等......
任何帮助将不胜感激。
更新:我只会需要此检查数据库中的重复记录,而不是更新。在调用Put函数之前,我将处理客户端的检查更新。
我有下面的代码这是非常近的工作:
public interface getId {
int Id { get; set; }
}
public class Check : getId
{
public int Id { get; set; }
public static bool CheckDBUniqueRecord<T>(T entity) where T : class, getId
{
MainDbContext db = new MainDbContext(Utility.PortalConnectionString());
var myDbSet = db.Set<T>().ToList();
foreach (var d in myDbSet)
{
d.Id = 0;
if (d == entity) return true;
}
return false;
}
}
通过使用通用约束,但是我得到的方法调用的错误:类型XXXX不能用作类型参数“T '在通用方法yyyyyy。没有从xxxx到yyyy的隐式引用转换。
这是什么修复?
回答:
第一件事,第一:这一切只是写下来的和未经考验......
的第一件事情很简单:你的函数签名......
public static bool CheckDbUniqueRecord<T>(T entity)
或类似像extensionmethod东西。 ..
public static bool CheckDbUniqueRecord<T>(this DbContext db, T entity)
基本上你想要做的就是查询您的DbContext为对应于你的实体的DbSet ...
var myDbSet = db.Set<T>();
现在你需要某种逻辑来找出你想检查哪些属性......这可以通过在你的实体类成员上放置属性来完成......这可以通过检查所有不是主键字段的东西来完成......你必须想出一些东西来告诉你测试哪些东西......为了简单起见,我将简单地介绍一些非常简单的事情,对于每个属性都有一个没有被命名为“ID”的getter ......根据您的实现,您最有可能想要将这些代码移动到初始化代码块不会每次都运行...
var t = typeof(T); var pInfos = t.GetProperties(BindingFlags.Public|BindingFlags.Instance).Where(x=>x.Name!="ID" && x.CanRead).ToArray();
Expression exp=null;
Expression pT = Expression.Parameter(t);
foreach(var p in pInfos)
{
Expression m = Expression.Property(pT,p);
Expression c = Expression.Constant(p.GetValue(entity));
if(tmp==null)
{
tmp=Expression.Equal(m,c);
}
else
{
tmp=Expression.AndAlso(tmp,Expression.Equal(m,c));
}
}
var myLambda=Expression.Lambda<Func<T,bool>>(tmp,pT);
return myDbSet.AsQueryable().Any(myLambda);
以上是 使用泛型函数查询EF5中的DBSet 的全部内容, 来源链接: utcz.com/qa/266774.html