Dapper - Query Methods

Bu yazımda Dapper ORM'ine ait Query metodu ve çeşitlerinin kullanımını örneklerle anlatacağım.

Query Metotları bir sonuç kümesi döndürür. ADO.NET'teki SqlDataReader objesinin yaptığı işi daha az kodla yapabilmemizi sağlar. Aynı zamanda bu sonuç kümesindeki verileri veritabanımıza karşılık gelen model sınıfları ile eşleştirir.

Query Metotları
  • Query()
  • QueryFirst()
  • QueryFirstOrDefault()
  • QuerySingle()
  • QuerySingleOrDefault()
  • QueryMultiple()
Query metotlarında kullanılan parametreler

Adı Tanım
sql Sql sorgumuzu yazacağımız alan
param Eğer sql sorgumuz parametre içerdiği durumlarda kullanılır.(varsayılan= null)
transaction Transaction varsa kullanılır.(varsayılan= null)
commandTimeout Command timeout'unu burada tanımlarız.(varsayılan= null)
buffered Yeniden oluşturulan sorgu sonuçlarını ara belleğe alma işlemi için doğru.(varsayılan= true)
commandType Sql sorgu türümüzü tanımlarız.Eğer Stored Procedure kullanacaksak bu parametreyi ekleriz.(varsayılan= null)

Bu metodun kullanımını örneklerle anlatalım. Northwind veritabanını kullandığım örneklerde öncelikle veritabanımıza karşılık gelen modelleri oluşturduk.

Veritabanımızdaki Categories ve Products tablolarına karşılık gelen Kategori ve Urunler sınıfları aşağıdaki gibidir. Bu sınıfları kullanarak CRUD işlemlerini yapabileceğiz.

public class Kategori
    {
        public string CategoryName { get; set; }

        public int CategoryId { get; set; }

        public string Description { get; set; }

        public Urunler Urun { get; set; }
    }

    public class Siparis
    {
        public int OrderID { get; set; }

        public string ProductName { get; set; }

        public Urunler Products { get; set; }

        public DateTime OrderDate { get; set; }

        public DateTime ShippedDate { get; set; }

        public DateTime RequiredDate { get; set; }

        public SiparisDetay OrderDetails { get; set; }
    }

    public class SiparisDetay
    {
        public string ProductName { get; set; }

        public Urunler Products { get; set; }

        public int OrderID { get; set; }

        public int Quantity { get; set; }

        public double UnitPrice { get; set; }

        public double Discount { get; set; }
    }

    public class Urunler
    {
        public int ProductId { get; set; }

        public string ProductName { get; set; }

        public int UnitsInStock { get; set; }

        public double UnitPrice { get; set; }

        public int CategoryId { get; set; }

        public string CategoryName { get; set; }

        public Kategori Kategori { get; set; }

        public SiparisDetay OrderDetails { get; set; }
    }

Bağlantımızı oluşturduğumuz  DbConnect class'ımız

public class DbConnect
    {
        private DbConnect()
        {

        }

        private static SqlConnection _connection;

        public static SqlConnection Connection
        {
            get
            {
                if (_connection==null)
                {
                    var connectionString = ConfigurationManager.ConnectionStrings["northWind"].ConnectionString;
                    _connection = new SqlConnection(connectionString);
                }

                if (_connection.State!=ConnectionState.Open)
                {
                    _connection.Open();
                }

                return _connection;
            }

        }

AppConfig veya web.config'de Connection String'imizi tanımladık

  <connectionStrings>
    <add name="northWind" connectionString="Server=ServerName;Database=NORTHWND;Trusted_Connection=True;"/>
  </connectionStrings>

Query()

Bu metodun kullanımı tip alıp almamasına göre ikiye ayrılır.

Anonymous Type - Dönüş tipi belli olmayan

Sql sorgumuzun sonuç kümesi dinamik bir liste döndürecektir. Sql sorgumuz bütün ürünleri döndürecektir.

connection değişkeni veritabanımıza bağlanacağımız connection'dır. Açık bir bağlantıya ihtiyaç duyar.

 public static List<dynamic> AnonymusList()
 {
   var connection = DbConnect.Connection;

   var urunListesi = connection.Query("SELECT * FROM Products").ToList();

   return urunListesi;
 }

Dynamic türündeki listemizden veritabanındaki alan adına göre verileri çekeceğiz.

 foreach (var urun in DapperMethods.AnonymusList())
 {
     Console.WriteLine("Ürün Adı:{0} Ürün Fiyatı:{1} Ürün Stok Miktarı:{2}",
      urun.ProductName, urun.UnitPrice, urun.UnitsInStock);
 }

Strongly Type - Dönüş tipi belli olan

Sql sorgumuzun sonuç kümesi ilgili tipten bir liste döndürecektir. Tip güvenliğini de sağlamış olacağız.

 public static List<Urunler> GetAllProducts()
 {
       var connection = DbConnect.Connection;

       List<Urunler> urunListesi = connection.Query<Urunler>("SELECT * FROM Products").ToList();

       return urunListesi;
 }

QueryFirst()

Sql sorgumuzun sonuç kümesindeki ilk elemanı döndürecektir.

public static Urunler GetProductById(int id)
{    
    var connection = DbConnect.Connection;

    var query = "Select * From Products Where ProductId=@ProductId";

    return connection.QueryFirst<Urunler>(query, new { ProductId = id });

}

QueryFirstOrDefault()

Sql sorgumuzun sonuç kümesindeki ilk elemanı döndürecektir. Eğer istenilen koşulda eleman yoksa o tipe ait varsayılan değeri döndürecektir.

public static Urunler GetProductById(int id)
{    
    var connection = DbConnect.Connection;

    var query = "Select * From Products Where ProductId=@ProductId";

    return connection.QueryFirstOrDefault<Urunler>(query, new { ProductId = id });

}

QuerySingle()

Sql sorgumuzun sonuç kümesinden tek bir eleman döndürecektir. Eğer istenilen koşulda eleman yoksa hata alacağız. Id değeri unique olduğu için tek bir eleman getirecektir.

public static Urunler GetProductById(int id)
{    
    var connection = DbConnect.Connection;

    var query = "Select * From Products Where ProductId=@ProductId";

    return connection.QuerySingle<Urunler>(query, new { ProductId = id });

}

QuerySingleOrDefault()

Sql sorgumuzun sonuç kümesinden tek bir eleman döndürecektir. Eğer istenilen koşulda eleman yoksa o tipe ait varsayılan değeri döndürecektir.

public static Urunler GetProductById(int id)
{    
    var connection = DbConnect.Connection;

    var query = "Select * From Products Where ProductId=@ProductId";

    return connection.QuerySingleOrDefault<Urunler>(query, new { ProductId = id });
}

Doğru metodu seçmek için aşağıdaki tablodan yararlanabilirsiniz.

Metot Veri Yoksa Tek Veri Birden Fazla Veri
Single Hata Tek Veri Hata
First Hata İlk Veri İlk Veri
SingleOrDefault Varsayılan Tek Veri Hata
FirstOrDefault Varsayılan İlk Veri İlk Veri

QueryMultiple()

sql parametresinde birden fazla sql sorgusu çalıştırabiliriz.Aşağıdaki metotta hem bütün ürünleri hem de kategorileri ayrı iki liste şeklinde döndüreceğiz. Öncelikle SqlMapper.GridReader türünden multiQuery değişkeninde iki sorguyu çalıştırdıktan sonra Read metoduyla liste oluşturabiliriz. Metodun sonunda bu listeleri ArrayList ile döndürüyoruz.

public static ArrayList SelectMultipleQueries()
{
   var connection = DbConnect.Connection;

   var sql = "Select * From Products; Select * From Categories";

   var multiQuery = connection.QueryMultiple(sql);
   var productList = multiQuery.Read<Urunler>().ToList();
   var categoryList = multiQuery.Read<Kategori>().ToList();

   return new ArrayList() { productList, categoryList };
}

Bu metodun ArrayList objeleri döndürdüğü için ilgili sınıfa türünden bir List yapısına dönüştürmemiz gerekir. Urunler türünden List'e dönüştürdüğümüz ArrayList'in ilk elemanıdır. Aşağıdaki kod yapısında ise bu metodun kullanımını görebiliriz.

var arr = DapperMethods.SelectMultipleQueries();
var product = arr[0] as List<Urunler>;

Console.WriteLine("ÜRÜNLER");

foreach (var item in product)
{
     Console.WriteLine(item.ProductName);
}

Console.WriteLine("-----------------");

Console.WriteLine("KATEGORİLER");
var category = arr[1] as List<Kategori>;

foreach (var item in category)
{
    Console.WriteLine(item.CategoryName);
}



Yorumlar