Я создал общий метод 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 общих столбцов (Id, тип), мне нужно написать общий метод расширения, чтобы присоединиться к этим таблицам, основанные на 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
и их характер правильно.
Любые указатели на то, где я, возможно, ошибаюсь?
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 места). Вы также можете использовать объект: new object [] {columnA, columnB}. Любой тип будет автоматически добавлен к объекту, но вам нужно передать его при назначении объекта типа конкретному типу. – jdweng
@ jdweng .. Я пробовал то, что вы сказали. Однако ошибка компилятора, но ошибка времени выполнения «Тип узла выражения LINQ« Lambda »не поддерживается в LINQ to Entities. '. Я пытаюсь понять это. Спасибо – Anurag
@jdweng: см. Редактирование и указание некоторых указателей.Спасибо – Anurag