我已經創建了基於一個公共列的通用extension
方法來加入2 tables
。代碼如下:LINQ JOIN使用2列的通用擴展方法
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});
}
}
現在在database
表有2個共同的列(身份證,輸入),我需要寫一個常見的擴展方法加入基於2個共有列,這些表中,寫的東西如下圖所示:
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
行規定如下錯誤....如下:
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.
這是無法理解arguments
及其性質正確。
任何指向我可能會出錯的地方?
編輯:
我現在有這編譯成功的方法,但我得到一個運行時錯誤 「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 to Entities不支持LINQ表達式節點類型'Lambda''。我正試圖弄清楚。謝謝 – Anurag
@jdweng:請參閱編輯並提供一些指示。謝謝 – Anurag