2016-11-13 8 views
0

しばらくの間プロジェクトで作業していましたが、基本的にC#とMysqlをサーバーサイドシステムとして組み合わせています。パフォーマンス上の問題のため、私は手作業でコードADO.NET私のMySQLのクエリですが、私は書く必要があるコードの量を減らしたいので、私は問題に直面している。Cで重複した同様のメソッドを減らす

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のクラスのは

ItemServiceクラスのメソッド(コードの下は一例です)しているとしましょう、私は抽象クラスを使用して考えています非常に類似する方法

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はraw SQLを渡すことができます。 – Prescott

+0

@Prescottコメントをいただきありがとうございます。私はDapperを見ましたが、パフォーマンスは従来のado.netに近いことがわかりましたが、このプロジェクトはもうしばらく進んでいますが、切り替えが非常に難しく(時間がかかる)、まだDapperを完全に把握していない。 ORMを除いて他の何か方法がありますか? –

+0

DapperはORMではありません.SQLを手動で記述するのではなく、単にORMを使用するだけです。これとは別に、あなたはおそらくリポジトリパターンを探しており、すべてのエンティティが共有する基本的な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

@Groo大きなポイント – Prescott

関連する問題