Я написал расширение LINQ, чтобы объединить 2 таблицы
public static IEnumerable<ObjectDetail<TLeft, string>> ToDetail<TLeft, TRight, TKey>(this IEnumerable<TLeft> left, IEnumerable<TRight> right, Func<TLeft, TKey> leftProperty, Func<TRight, TKey> rightProperty, Func<TRight, TKey> keyProperty, Func<TRight, TKey> valueProperty, string keySelector)
{
return (from l in left
join r in right on leftProperty(l) equals rightProperty(r) into one
select new
{
l,
one
}).AsEnumerable().Select(q => new ObjectDetail<TLeft, string>
{
Item = q.l,
Meta = q.one.Where(m => keySelector.Contains(keyProperty(m).ToString())).ToDictionary(m => keyProperty(m).ToString(), m => valueProperty(m).ToString())
});
}
Компилятор хорошо понимает расширение, но когда я пытаюсь написать
var result = left.ToDetail(right, l => l.ID, r => r.ID, r => r.Key, r => r.Value, "Key");
Я получил следующую ошибку:
Аргументы типа для метода
.ToDetail (System.Collections.Generic.IEnumerable,
System.Collections.Generic.IEnumerable,
System.Func,
System.Func,
System.Func,
System.Func, string) '
не может быть выведено из использования. Пытаться
указание аргументов типа
явно
Затем я попытался удалить параметры keyProperty и valueProperty из расширения, оно работает без ошибок. Я не знаю почему, может быть, компилятор запутался и не может определить параметр с таким же типом?
Буду признателен за любую помощь!