如何检查c#中是否存在行

时间:2018-01-17 13:35:27

标签: c#

这是我的第一篇文章。我不熟悉c#。我有以下代码添加或更新表格如下。

context.Configuration.AddOrUpdate(
    c =>  c.ClientSiteId,
    new List.Configuration
    {
        ClientSiteId = 0,
        APIUserName = "Name",                   
        APIPassword = "Password"
    });

我如何告诉上面检查clientiteid是否存在它不应该更新,如果没有clientiteid为0那么它应该添加。

我知道你可以使用Any(),我不知道如何使用它。

2 个答案:

答案 0 :(得分:3)

我运行FirstOrDefault(c => c.ClientSiteId)来获取具有该ID的DB对象,如果它存在,那么该对象将被填充并且可以被修改,如果它不存在然后将返回默认值,此时您可以更改它们然后提交。

答案 1 :(得分:1)

听起来您只想使用Add,而不是AddOrUpdate。当然,另一部分是我们需要做的事情,如果已经存在的话。 最简单的解决方案是为了确保存在合适的唯一约束,如果您尝试复制,只需让它爆炸。更优雅的基于ORM的方法可能是尝试找到项目,如果它不存在 - 添加它;即。

var newObj =  new List.Configuration
{
    ClientSiteId = 0,
    APIUserName = "Name",                   
    APIPassword = "Password"
}
// ...
var item = dbSet.SingleOrDefault(x => x.ClientSiteId == newObj.ClientSiteId);
if(item == null) {
    dbSet.Add(newObj);
} else {
    // do something graceful, like tell the user
}

请注意,由于竞争条件,如果唯一性很重要,这种检查仍应与DB级约束配对。

你可能可以使用Any代替SingleOrDefault,但是......真的,由你决定;例如:

if(!dbSet.Any(x => x.ClientSiteId == newObj.ClientSiteId)) {
    // add
} else {
    // graceful error
}

但最终,从null获取SingleOrDefault的价格与Any一样便宜,并且在#34;优雅的错误中排除了#34}。如果您想提供以下详细信息,请执行以下操作:

throw new InvalidOperationException(
    $"New configuration conflicts with {item.ClientSiteId} '{item.APIUserName}'");