2017-04-26 13 views
0

私はこのトピックをしばらく見回しましたが、私が実際に理解していた答え(または近くに何かを尋ねている人)を見つけることができませんでした。Entity Frameworkからユーザー指定のテーブルを選択

問題の説明: 私は、複数のテーブルを持つデータベースを持って​​を言う、oranges、およびbananas。それはそれぞれの下にたくさんの情報を持っています。これらのプロパティの1つは一般的です。expirationDateとしましょう。

は、私は、テーブル名を持つものの一つの有効期限(例えば、id=1apple

は、ユーザーがGUIでこのすべてを選択することができます(コンボボックスを照会できるようにするには、ユーザーが必要そして私がこれまで持って何idのためのテキストボックス)

:背景コード/ビジネス・ロジックで は、私が

. 
. 
. 
if(tableName.Equals("apples")) 
    { 
     DateTime expDate = getAppleDetails(id) 
    } 
if(tableName.Equals("oranges")) 
    { 
    //call function to select the single orangeEntry and do the rest 
    } 

} 
DateTime getAppleDetails(long id) 
{ 
    using(var db = new myContext()) 
    { 
    var appleEntry = db.apples.Single(x=>x.id==id); 
    return appleEntry.ExpDate 
    } 
} 
を以下しています

私が探しているもの: 上記のコードは、サイズの大きなデータベースでは、たくさんのコードを複製する必要がなくなります。同じクエリでこれを行うより良い方法は何ですか? 何かのようなdb.TableNameHere.Single(x=> x.id == id)

答えて

1

あなたが必要なすべてのクラスがIExpirationDateインタフェースを実装する場合ExpirationDateと、次の

public interface IExpirationDate 
{ 
    DateTime ExpirationDate { get; set; } 
} 

あなたのクラスのように見える例IExpirationDateのために呼ばれるインタフェースは、たとえば

public class Orange : IExpirationDate 
{ 
    //Other properties of the class 

    public DateTime ExpirationDate { get; set; } //Property from interface 
} 

ため、IExpirationDateを実装する必要があります持っていることができますいずれかの有効期限を取得する一般的な方法を1つ持つことができます。これは次のようになります

public static DateTime GetExpirationDate<T>(long id) 
     where T : class, IExpirationDate 
{ 
    using(var db = new myContext()) 
    { 
     var entry = db.Set<T>.Find(id); 
     return entry.ExpirationDate; 
    } 
} 

、あなただけの

var expirationDate = GetExpirationDate<Orange>(id); 
+0

それでも私はコードで表を指定する必要はありませんか?つまり、UIから取り出された文字列に応じて、文字列を比較して関数を正しいDBSetと呼び出す必要があるという意味で意味があります。 重複したコードの量を大幅に減らす – robotHamster

+0

実際には、実装しようとしましたが、コードを減らすうえで効果的です!どうもありがとう! – robotHamster

1

まず、単純な改善は、og db.Single(x => x.id == id)の代わりにdb.apples.Find(id)を使用することです。あなたがIDを持っている場合、Findはより速くなります。

汎用リポジトリを使用して、データベースへの呼び出しを呼び出すことができます。 この記事の内容http://www.tugberkugurlu.com/archive/generic-repository-pattern-entity-framework-asp-net-mvc-and-unit-testing-triangleは内容を詳細に説明しています。

+0

ありがとうを呼び出すことができますOrangeクラスの有効期限を取得します!私は今夜​​のブログ投稿を見て、それが私にどのように役立つかを見てみましょう:) – robotHamster

関連する問題