2016-11-13 51 views
0

一直在工作一段時間,基本上它是C#和Mysql作爲服務器端系統的組合。由於性能問題,我將代碼ADO.NET交給我的mysql查詢,但我面臨一個問題,因爲我想減少需要編寫的代碼量。在c#中減少重複類似的方法

比方說

ItemService類有方法(下面的代碼只是一個例子)

protected internal List<Item> Read() 
    { 
     List<Item> itemList = new List<Item>(); 
     String query = @"SELECT * FROM items"; 
     itemList = IRead(query); 
     return itemList; 
    } 

protected internal Item Read(int id) 
    { 
     List<Item> itemList = new List<Item>(); 
     Item item = new Item(); 
     String query = String.Format(@"SELECT * FROM items WHERE id = {0}", id); 
     itemList = IRead(query); 
     item = itemList.FirstOrDefault(); 
     return item; 
    } 
protected internal List<Item> Read(int startId, int limit, String orderBy = "id", String order = "ASC") 
    { 
     List<Item> itemList = new List<Item>(); 
     String query = String.Format(@"SELECT * FROM items WHERE id >= {0} ORDER BY '{1}' '{2}' LIMIT {3}", startId, orderBy, order, limit); 
     itemList = IRead(query); 
     return itemList; 
    } 

而且OrderService類具有非常相似的方法

protected internal List<Order> Read() 
    { 
     List<Order> orderList = new List<Order>(); 
     String query = @"SELECT * FROM items"; 
     orderList = IRead(query); 
     return orderList; 
    } 
protected internal Order Read(int id) 
    { 
     Order order = new Order(); 
     String query = String.Format(@"SELECT * FROM invoices WHERE id = {0}", id); 
     order = IRead(query).FirstOrDefault(); 
     return order; 
    } 

我想到的是使用抽象類,但我如何處理不同的返回對象(動態除外)以及方法內部的不同字符串查詢。非常感謝您的幫助。

+0

你可以看看[Dapper](https://github.com/StackExchange/dapper-dot-net)。這些查詢似乎很簡單,我認爲這不屬於您的性能問題。您應該使用ORM,然後僅在性能問題的情況下,才能使用原始SQL。大多數ORM可以處理你通過它們傳遞原始的sql。 – Prescott

+0

@Prescott感謝您的評論,我確實瞭解了Dapper,我知道性能接近於經典的ado.net,但是這個項目已經持續了一段時間,很難切換(耗時),而且我仍然還沒有完全掌握Dapper。除了ORM之外,還有其他方法嗎? –

+0

Dapper不是ORM,您只需使用它而不是手動編寫SQL。除此之外,您可能正在尋找一個存儲庫模式,並且您可能會創建一個通用基礎存儲庫,用於所有實體將共享的基本CRUD操作。請注意,[Dapper Extensions](https://github.com/tmsmith/Dapper-Extensions)基本上爲您提供了在基本Dapper查詢之上的CRUD功能,這意味着您可以輕鬆實現基本回購。 – Groo

回答

1

您可以創建一個抽象基類,做最繁重的工作適合你:

public abstract class ItemBase<T> where T : new() 
{ 
    public abstract string table_name { get; } 

    protected internal T Read(int id) 
    { 
     var query = [email protected]"SELECT * FROM {table_name} WHERE id = {id}"; 
     //var itemList = IRead(query); 
     Console.WriteLine(query); //Did this as console output for testing 
     return new T(); // temList.FirstOrDefault(); 
    } 

    protected internal List<T> Read(int startId, int limit, string orderBy = "id", string order = "ASC") 
    { 
     string query = [email protected]"SELECT * FROM {table_name} WHERE id >= {startId} ORDER BY {orderBy} {order} LIMIT {limit}"; 
     Console.WriteLine(query); //Console output for testing 
     return null; 
     //return IRead(query); 
    } 
} 

然後你就可以創建個人記錄類,像這樣:

public class Item : ItemBase<Item> 
{ 
    public override string table_name => "items"; 
} 

你可以用它像這樣:

//Console Application: 
class Program 
{ 
    static void Main(string[] args) 
    { 
     var i = new Item(); 
     i.Read(12); 
     i.Read(1, 2); 
     Console.ReadLine(); 
    } 
} 
+1

這很酷,雖然我會使用不同的基類名稱似乎是一個不好的選擇(例如'BaseRepository '或'RepoBase ',這樣就可以在ItemBase 中沒有「Item」 ) – Groo

+0

@格羅偉大的一點 – Prescott