我正在使用Linq并检查数据库中是否存在记录,并且它是最新版本。我可以使用Linq
来做到这一点bool query = db.foo.Any(x => x.Id == list.Id);
然后检查这是否会产生真假结果。
我对这种方法的问题是,如果我想检查表的所有属性以确定现有数据是否与新副本不同,那么它需要我为每个属性和列表项指定映射。
有没有办法可以迭代,还是有其他替代方案?
x
指的是表示数据库的实体框架对象
list
是一个映射,它将1对1映射到Entity Framework对象。
答案 0 :(得分:0)
foo query = db.foo.Where(x => x.Id == list.Id).FirstOrDefault();
if(query != null)
{
properties = query.GetType().GetProperties();
foreach(PropertyInfo prop in properties)
{
if (list.GetType().GetProperty(prop.Name) != null)
{
var val1 = list.GetType().GetProperty(prop.Name).GetValue(list);
var val2 = prop.GetType().GetProperty(prop.Name).GetValue(prop);
// do your checking here
}
}
}
答案 1 :(得分:0)
如果我理解正确,你需要一种for each
循环迭代一行的所有列,并检查它们是否与列表中的相应数据匹配 - 这是正确的吗?
简短的回答是:对不起,我认为你不能这样做(至少不会没有使用一些反思技巧,这可能会比较混乱,并且表现不如你想要的那样好。)
使用SQL,您可以编写:SELECT * FROM table (...)
,但Linq中没有这样的选项;您需要明确指定每列的名称。
你可以做什么,也可能应该做什么,是Jon Skeet在评论中简要提到的:添加版本号,或者可能是你可以检查的时间戳。以这样的方式编写逻辑,即可以确定如果版本正确/更新,则该行有效。
然后,您可以通过查看特定行的版本号来检查特定行的有效性。例如,您可以这样做:
// Does a row with specified ID exist and the newest version exist:
bool isRowValid = db.foo.Any(x => x.Id == list.Id &&
x.VersionNr == list.newestVersionNr);
答案 2 :(得分:0)
bool chechExists = db.foo.Exists(x => x.Id == list.Id);
这将根据需要返回bool