一般的な列に基づいて2 tables
を結合する汎用のextension
メソッドを作成しました。 、今database
のテーブルが2つの共通の列(ID、タイプ)を持って、私は2つの共通の列に基づいてこれらのテーブルを結合するための一般的な拡張メソッドを記述する必要が2列を使用したLINQ JOINの汎用拡張メソッド
public class SomeDTO<T,U>
{
public T TableA { get; set; }
public U TableB { get; set; }
}
public static class Helper
{
public static IQueryable<SomeDTO<T,U>> JoinExtension<T,U,Key>(this IQueryable<T> tableA, IQueryable<U> tableB, Expression<Func<T,Key>> columnA, Expression<Func<U,Key>> columnB)
{
return tableA.Join(tableB, columnA, columnB,(x, y) => new SomeDTO<T, U>{TableA = x,TableB = y});
}
}
何かを書いた:コードは以下の通りです。以下のように:それは理解することができません
The type arguments for method 'Queryable.Join<TOuter, TInner, TKey, TResult>(IQueryable<TOuter>, IEnumerable<TInner>, Expression<Func<TOuter, TKey>>, Expression<Func<TInner, TKey>>, Expression<Func<TOuter, TInner, TResult>>)' cannot be inferred from the usage. Try specifying the type arguments explicitly.
:
public static IQueryable<SomeDTO<T, U>> JoinExtensionTwoColumns<T, U, Key>(this IQueryable<T> tableA, IQueryable<U> tableB, Expression<Func<T, Key>> columnA, Expression<Func<U, Key>> columnB, Expression<Func<T, Key>> columnC, Expression<Func<U, Key>> columnD)
{
return tableA.Join(tableB, a => new { columnA, columnB }, b => new { columnC, columnD }, (a, b) => new SomeDTO<T, U> { TableA = a, TableB = b });
}
コンパイラは、以下のようなエラーが....コードtableA.Join
の行で、以下のように述べて、私を与えますarguments
とその性質が正しくあります。
私が間違っているかもしれないどこへのポインタ?
EDIT:
私は今、正常にコンパイルする方法がありますが、私のようなメソッド呼び出し "The LINQ expression node type 'Lambda' is not supported in LINQ to Entities.
"
public static IQueryable<SomeDTO<T, U>> JoinExtensionTwoColumns<T, U, Key>(this IQueryable<T> tableA, IQueryable<U> tableB, Expression<Func<T, Key>> columnA, Expression<Func<U, Key>> columnB, Expression<Func<T, Key>> columnC, Expression<Func<U, Key>> columnD)
{
return tableA.Join(tableB, a => new object[]{ columnA, columnB }, b => new object []{ columnC, columnD }, (a, b) => new SomeDTO<T, U> { TableA = a, TableB = b });
}
ことをランタイムエラーを取得:
var result= (db.table1.JoinExtensionTwoColumns<table1,table2,int>(db.table2, c => c.id.ToString(), d => d.id.ToString(),e => e.type, f => f.type)).Take(10);
を
これ以上ポインタはありません。
をあなたは持っています名前が必要な匿名型:new {columnA、columnB}(2つの場所)。代わりにobject:new object [] {columnA、columnB}を使用することもできます。どのタイプも自動的にオブジェクトにキャストされますが、タイプオブジェクトを特定のタイプに割り当てるときにキャストする必要があります。 – jdweng
@ jdweng ..私はあなたが言ったことを試みました。コンパイラエラーは発生しませんが、ランタイムエラー 'LINQ式のノードタイプ' Lambda 'はLINQ to Entitiesでサポートされていません。'私はそれを理解しようとしています。ありがとう – Anurag
@jdweng:編集を参照して、いくつかの指摘をしてください。ありがとう – Anurag