Я пытаюсь сделать запрос left outer join
, который также имеет custom comparator
.Linq left external join with custom compator
У меня есть следующие списки:
List<ColumnInformation> list1;
List<ColumnInformation> list2;
Они содержат информацию о столбце SQL (тип данных, имя таблицы и т.д.). Я переопределил Equals
для этого класса и сделал operator ==
и operator !=
.
Я понимаю, как make a left outer join:
var leftOuterJoin = from l1 in list1
join l2 in list2 on l1.objectID equals l2.objectID into temp
from l2 in temp.DefaultIfEmpty(new { l1.ID, Name = default(string) })
select new
{
l1.ID,
ColumnName1 = l1.Name,
ColumnName2 = l2.Name,
};
И я понимаю, как создавать и использовать пользовательские IEqualityComparer
:
public class ColumnComparer : IEqualityComparer<ColumnInformation>
{
public bool Equals(ColumnInformation x, ColumnInformation y)
{
return x == y; //this uses my defined == operator
}
public int GetHashCode(ColumnInformation obj)
{
return 1; //forcing the join to use Equals, just trust me on this
}
}
ColumnComparer cc = new ColumnComparer();
var joinedList = list1.Join(list2,
x => x,
y => y,
(x, y) => new {x, y},
cc);
Мой вопрос: Как я могу сделать как левое внешнее соединение и использовать мой компаратор одновременно?
Насколько я знаю, синтаксис запроса не имеет ключевого слова для компаратора, а метод расширения не имеет ничего для ключевого слова into
.
Мне все равно, есть ли результат в синтаксисе запроса или методах расширения.
Вы можете переопределить Equals ColumnInformations и GetHashCode, как реализовано в ColumnComparer. –
@HamletHakobyan, я переопределил 'Equals' в' ColumnInformation'. Сейчас мой код не трогает его. Какая польза от этого (также для GetHashCode)? – gunr2171
Должен сказать, что ** вы можете делать все, что хотите в LINQ ** с помощью методов расширения, но ** вы не можете делать некоторые вещи в LINQ с синтаксисом запроса **. Фактически эквивалент 'join into' в' методах расширения' - 'GroupJoin'. –