使用Linq存在检查数据库中记录的最有效方法

时间:2014-04-08 05:42:00

标签: c# linq entity-framework

我正在使用Linq并检查数据库中是否存在记录,并且它是最新版本。我可以使用Linq

来做到这一点
bool query = db.foo.Any(x => x.Id == list.Id);

然后检查这是否会产生真假结果。

我对这种方法的问题是,如果我想检查表的所有属性以确定现有数据是否与新副本不同,那么它需要我为每个属性和列表项指定映射。

有没有办法可以迭代,还是有其他替代方案?

x指的是表示数据库的实体框架对象 list是一个映射,它将1对1映射到Entity Framework对象。

3 个答案:

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