2012-03-31 13 views
7

私はこのようなコードを持っている:私たちは、コード内のいくつかの退屈な繰り返しを気づくことができるC#で自分のLINQ構造体を定義するには?

class PacketDAO{ 
    //... 
    public void UpdatePacketStatus(Guid packetID, Status status) 
    { 
     using (var ctx = new DataContext()) 
     { 
      var packet = ctx.Packet.SingleOrDefault(p => p.PacketID == packetID); 
      packet.Status = status; 
      ctx.SubmitChanges(); 
     } 
    } 

    public void UpdatePacketTime(Guid packetID, DateTime? time) 
    { 
     using (var ctx = new DataContext()) 
     { 
      var packet = ctx.Packet.SingleOrDefault(p => p.PacketID == packetID); 
      packet.Time = time; 
      ctx.SubmitChanges(); 
     } 
    } 
    //... 
}  

を。

だから、それは我々がこのような何かを書くために自分自身を余裕があるように、一般的な方法で更新を書くことがいいだろう:

packet.Update<Guid, Packet>(guid, p => p.Time = DateTime.Now); 
packet.Update<Guid, Packet>(guid, p => p.Status = Status.Ok); 

は、教えてください、それは、そのようなメソッドを記述することが可能であるしてください?

私はそれをどのような本から学ぶことができますか?

(私は一つだけ近い例を発見した:http://msdn.microsoft.com/en-us/library/cc981895.aspxを、それから私の更新方法を導出する方法を十分に明確ではありません)

はありがとうございます。

UPD。

[OK]を、ジョンスキートは私の呼び出しが異なって見えるべきであると、そこに問題の間違った何かがだ、と私は同意伝え、私はこれらの呼び出しが可能だと思う:

packet.Update<Packet>(p => p.packetID == guid, p => p.Time = DateTime.Now); 
packet.Update<Packet>(p => p.packetID == guid, p => p.Status = Status.Ok); 
+0

データを更新するLINQのような方法は少し不自然です – zerkms

+1

[Pro Linq](http://www.amazon.com/Pro-LINQ-Language-Integrated-Experts/ dp/1590597893)。 –

答えて

10

は、通常のヘルパー関数を書くことから始めましょう。これはLINQとは関係ありません。

public static void UpdatePacket(Guid packetID, Action<Packet> update) 
{ 
    using (var ctx = new DataContext()) 
    { 
     var packet = ctx.Packet.SingleOrDefault(p => p.PacketID == packetID); 
     update(packet); 
     ctx.SubmitChanges(); 
    } 
} 

このように、update-delegateを使用して、呼び出しごとに異なる小さなコードを抽出することができます。残りは同じで、今は集中化して再利用しています。

また、この方法は一般的なことができます:

public static void UpdatePacket<TEntity>(Expression<Func<TEntity, bool>> filter, Action<TEntity> update) 
{ 
    using (var ctx = new DataContext()) 
    { 
     var e = ctx.GetTable<TEntity>().Single(filter); 
     update(e); 
     ctx.SubmitChanges(); 
    } 
} 

あなたはフィルタを自動化したい場合は、フィルタ式を構築するための式と反射APIを使用する必要があります。そのコードはもう少し長いです。

+4

拡張メソッドを使用していないことに注意してください。ここでは必要ありません。シンプルであれば簡単に行く。 – usr

+2

自分の答えにコメントを書くのではなく、編集して追加の情報を直接回答に加えることができます:) –

+0

はい、パケットとは異なるテーブルの単一フィールドの更新メソッドが必要な場合は、やや高次の抽象レイヤーでのコードの繰り返し。静的void UpdateMessage(int messageId、Action update)というシグニチャーとほぼ同じヘルパー関数を書いています。 – gentlenub

関連する問題