如何使用OrmLite的UpdateOnly方法更新部分表?

时间:2014-07-08 09:59:01

标签: sqlite servicestack ormlite-servicestack

我正在尝试更新桌面上的两个字段。我尝试了几件事,但我尝试的更新影响了其他领域。这是我的代码:

// Updates a row in the PatientSession table. Note that this call updates
public string UpdateEndPatientSession(PatientSession p)
{       
    // Update fields I set but reset data other fields
    _dbConnection.Update<PatientSession>(p);

    // Rename all fields of the column
    _dbConnection.UpdateOnly(new PatientSession { Id = p.Id, PatientEndSessionTime = p.PatientEndSessionTime, PatientEndSessionByUserId = p.PatientEndSessionByUserId }, (PatientSession patient) => new { patient.Id, patient.PatientEndSessionTime, patient.PatientEndSessionByUserId });
    _dbConnection.Update<PatientSession>(new { PatientSessionId = 10, PatientEndSessionTime = sessiontime, PatientEndSessionByUserId = 159 });
    string IdInsert = "{\"PatientSessionId\":" + p.Id + "}";
    return IdInsert;
}

我按照ServiceStack tutorial上的说明操作,但我无法使其正常工作。我不理解如何更新行而不选择具有主ID的行。

我尝试了一个基本的SQL请求,但得到了SQLiteException

string patientendsessiontime = p.PatientEndSessionTime.ToString();
string patientendsessionbyuserid = p.PatientEndSessionByUserId.ToString();
string patientsessionid = p.Id.ToString();

string SQLraw = "UPDATE PatientSession SET PatientEndSessionTime = " + patientendsessiontime + ", PatientEndSessionByUserId =  " + patientendsessionbyuserid + " WHERE PatientSessionId = " + patientsessionid + "";
_dbConnection.ExecuteSql(SQLraw);

enter image description here

我只想进行部分更新。

2 个答案:

答案 0 :(得分:3)

您需要在WHERE语句中指定UpdateOnly子句。

public string UpdateEndPatientSession(PatientSession p)
{
    _dbConnection.UpdateOnly(
        p, 
        onlyFields: ps => new { ps.PatientEndSessionTime, ps.PatientEndSessionByUserId },
        where: ps => ps.Id == p.Id
    );
    ...

语法:

_dbConnection.UpdateOnly(
    p, // The source data object
    onlyFields: ps => ... , // The fields you want from the source data object
    where: ps => ... // The record match condition
);

有关更多示例,请参阅update documentation


顺便说一句,我看到你返回一个string类型,然后构建一个JSON响应:

  

string IdInsert =&#34; {\&#34; PatientSessionId \&#34;:&#34; + p.Id +&#34;}&#34;

您知道吗您可以简单地将回报设置为object,然后执行:

return new { PatientSessionId = p.Id };

对我来说,你不想自己处理JSON序列化。

答案 1 :(得分:0)

好的,我找到了SQLite表达式的解决方案:

        string patientendsessiontime = p.PatientEndSessionTime.ToString();
        string patientendsessionbyuserid = p.PatientEndSessionByUserId.ToString();
        string patientsessionid = p.Id.ToString();

        string SQLraw = "UPDATE PatientSession SET PatientEndSessionTime = '" + patientendsessiontime + "', PatientEndSessionByUserId =  " + patientendsessionbyuserid + " WHERE Id = " + patientsessionid + "";

        _dbConnection.ExecuteSql(SQLraw);

我在语法方面犯了错误,但是如果有人有另一个例子而不是文档,我仍然不知道如何使用匿名函数,我确信它不是非常有用的:)