最简单的方法来使用Dapper ORM

时间:2015-10-28 09:52:18

标签: c# object dapper

将Dapper ORM查询的输出提供给提供查询方法的类的数据成员的最简单方法是什么?

这是我的代码,方法A(丑陋)和B(不起作用):

public class MyLab_ClientRef
{
    public int UserId { get; set; }
    public string ClientId { get; set; }
    // ... more fields ...

    public bool GetUser(OracleConnection conn, int UserId, string ClientId)
    {
        bool Ok = false;
        IEnumerable<MyLab_ClientRef> QueryResultRecords =
            conn.Query<MyLab_ClientRef>(@"
                SELECT *
                FROM MyLab_ClientRef
                WHERE UserId   = :UserId
                  AND ClientId = :ClientId",
            new { UserId = UserId, ClientId = ClientId });
        if (QueryResultRecords.Count() == 1)
        {
            // Method A
            MyLab_ClientRef Rec = QueryResultRecords.First(); // works
            CopyRec(Rec, this);                               // ugly

            // Method B
            this = QueryResultRecords.First();            // avoids CopyRec, does not work

            Ok = true;
        }
        return Ok;
    }

    private static void CopyRec(MyLab_ClientRef CR_From, MyLab_ClientRef CR_To)
    {
        CR_To.UserId = CR_From.UserId;
        CR_To.ClientId = CR_From.ClientId;
    }
}

我喜欢将记录定义保持在接收记录的查询附近,但不喜欢以这种方式为每个表类实现CopyRec方法。

有没有更好的方法来实现这个?我试着写this = ...但这是不可能的。

如何编写比方法A更好的方法B?

1 个答案:

答案 0 :(得分:0)

以下不起作用:

this = QueryResultRecords.First();

检查以下链接了解原因:

Why can't I set "this" to a value in C#?

MSDN

如上面的第一个链接所示,您最好的选择仍然是您从给定方法返回MyLab_ClientRef,可以将其设置为静态并使用if value or reference赋值,在这种情况下要么屈服相同的结果

如果您的视图中有更清晰的实现,请检查以下内容:

public class MyLab_ClientRef
{
    public int UserId { get; set; }
    public string ClientId { get; set; }
    // ... more fields ...

    public static MyLab_ClientRef GetUser(OracleConnection conn, int UserId, string ClientId)
    {
        bool Ok = false;

        var QueryResultRecords =
            conn.Query<MyLab_ClientRef>(@"SELECT * FROM MyLab_ClientRef WHERE UserId = :UserId AND ClientId = :ClientId",new { UserId = UserId, ClientId = ClientId });

            if(QueryResultRecords.Any())
                return QueryResultRecords.First();
            else
                return null;        

    }  
}

可以称为:

var newClient = MyLab_ClientRef.GetUser(conn, UserId,ClientId);

虽然connection对象是方法的本地对象并且在using时钟

中使用,但它会更受欢迎