2

ジェネリックで LINQ 結合クエリを記述しようとしていますが、外部キーの識別に問題があります。PFB コード。

比較操作に使用できる、テーブル U に存在する外部キーを特定したいと考えています。

var _tab = (from tblT in context.GetTable<T>()
            join tblU in context.GetTable<U>()
            on pk equals fk 
            select tblT).GetEnumerator();
4

2 に答える 2

6

「テーブルUに存在する外部キーを特定したい」と述べています。リフレクションと何らかの慣習を介してそれを行うことができるかもしれませんが、それは脆弱な解決策のようです. デリゲートを介して主キーと外部キーの関係を提供することをお勧めします。

基本的に、結合はデリゲートを使用して主キーと外部キーを取得し、LINQ プロバイダーはそれを結合句に変換します。結合の両側の署名は基本的に同じです。あなたの例では、Expression<Func<T, TKey>>Expression<Func<U, TKey>>. キー タイプは、結合の両側で同じでなければならないことに注意してください。

このメソッドを呼び出すために使用するものは何でも、これらのデリゲートを渡す必要があります。次のようになります。

public class Query
{
    public IEnumerable<T> GetData<T, U, TKey>(Expression<Func<T, TKey>> tKey, Expression<Func<U, TKey>> uKey)
    {
        Context context = new Context();
        // using the extension method as the query expression had trouble figuring out the types
        var data = context.GetTable<T>().Join(context.GetTable<U>(), tKey, uKey, (tblT, tblU) => tblT);            

        return data;
    }
}

それを呼び出すと、次のようになります。

var data = query.GetData<Person, Order, int>(person => person.Id, order => order.Orderer.Id);
于 2012-12-23T03:10:52.573 に答える