2016-11-13 53 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