2016-11-13 1 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"; 
} 

당신은 그것을 사용할 수 있습니다 like :

+1

다른 기본 클래스 이름을 사용하는 것은 좋지만 (예 :'BaseRepository '또는'RepoBase '과 같이 좋지 않으므로 ItemBase '에 항목이 없습니다.) – Groo

+0

@ 그루 큰 포인트 – Prescott

관련 문제