ใช้ LinQ กับ mongodb บน .NET Core 2.0

น้องแอ๋มมาบอกว่า อยากให้ลองใช้ LinQ แล้วจะติดใจ เลยลองเอาตัวอย่างเดิมที่เขียนต่อกับ mongodb มา modify เพิ่ม โดยการก๊อปปี้เอา CustomersService class มาสร้างเป็น CustomersLinQService class แล้วแก้ให้มาใช้ LinQ

จากที่ได้ลองกับ CRUD ก็เจอว่า มีเฉพาะส่วนที่เป็นการ retrieve เท่านั้นที่เขียนต่างออกไป จากเดิม

public async Task<IEnumerable<Customer>> All()
{
    var list = await this.col.Find(new BsonDocument()).ToListAsync();
    return list;
}

public async Task<Customer> Get(string id)
{
    var cust = await this.col.Find(x => x.Id == id).FirstAsync();
    return cust;
}

กลายเป็น

public async Task<List<Customer>> All()
{
    var custs = await (this.col.AsQueryable()
        .Select(c => c))
        .ToListAsync();
    return custs;
}

public async Task<Customer> Get(string id)
{
    var cust = await (this.col.AsQueryable()
          .Where(c => c.Id == id)
          .Select(c => c))
        .FirstAsync();
    return cust;
}

เอาจริง ๆ คือ ยังไม่ได้รู้สึกว่าเด็ดกว่าเดิม อาจจะเป็นเพราะ mongodb driver เดิมมันก็สั้น และอ่านไม่ยากอยู่แล้ว พอมาเปลี่ยนเป็น LinQ ก็ไม่ได้รู้สึกอะฮ้า!อะไร แต่ก็ได้รู้จักอะไรเพิ่มขึ้นอีกหน่อย

จริง ๆ ใน LinQ ตอน select ของออกมา มันเขียนอะไรแบบนี้ได้ด้วยนะ

public async Task<List<Customer>> All()
{
    var custs = await (from c in this.col.AsQueryable()
      select c).ToListAsync();
    return custs;
}

public async Task<Customer> Get(string id)
{
    var cust = await (from c in this.col.AsQueryable()
      where c.Id == id
      select c).FirstAsync();
    return cust;
}

แต่พอลองมาอ่านแล้วรู้สึกว่า เออ แม่ง งงกว่าเดิมอีก กลายเป็น mixed syntax ซะงั้น

จริง ๆ แล้ว LinQ น่าจะดี ถ้าเอาไปเปรียบเทียบกับการเขียน SQL Statement ทั่ว ๆ ไป เพราะ LinQ มันเป็น SQL Builder ที่มี chained method ทำให้อ่านง่าย แต่ตัว mongodb เองก็ถูกออกแบบมาแบบนั้นเหมือนกันอยู่แล้ว เลยน่าจะไม่เห็นความแตกต่างอะไรอย่างเห็นได้ชัดขนาดนั้น

โค้ดตัวอย่าง

อัพเดทเพิ่มไว้ที่ repo เดิมแล้ว https://github.com/chonla/MongoDBDotNetCore

Leave a Reply