Ответ 1
AFAIK вы можете присоединиться только так:
var query = from obj_i in set1
join obj_j in set2 on
new {
JoinProperty1 = obj_i.SomeField1,
JoinProperty2 = obj_i.SomeField2,
JoinProperty3 = obj_i.SomeField3,
JoinProperty4 = obj_i.SomeField4
}
equals
new {
JoinProperty1 = obj_j.SomeOtherField1,
JoinProperty2 = obj_j.SomeOtherField2,
JoinProperty3 = obj_j.SomeOtherField3,
JoinProperty4 = obj_j.SomeOtherField4
}
Основные требования: Имена свойств, типы и порядок в анонимных объектах, с которыми вы соединяетесь, должны соответствовать.
Вы не можете использовать ANDs OR и т.д. в соединениях. Просто object1 равно object2.
Более продвинутый материал в этом примере LinqPad:
class c1
{
public int someIntField;
public string someStringField;
}
class c2
{
public Int64 someInt64Property {get;set;}
private object someField;
public string someStringFunction(){return someField.ToString();}
}
void Main()
{
var set1 = new List<c1>();
var set2 = new List<c2>();
var query = from obj_i in set1
join obj_j in set2 on
new {
JoinProperty1 = (Int64) obj_i.someIntField,
JoinProperty2 = obj_i.someStringField
}
equals
new {
JoinProperty1 = obj_j.someInt64Property,
JoinProperty2 = obj_j.someStringFunction()
}
select new {obj1 = obj_i, obj2 = obj_j};
}
Адресация имен и порядок свойств проста, типы адресации могут быть достигнуты с помощью методов литья/преобразования/разбора/вызова и т.д. Это может не всегда работать с LINQ to EF или SQL или NHibernate, большинство вызовов методов определенно не будут работать и не будет работать во время выполнения, поэтому YMMV. Это связано с тем, что они копируются в общедоступные свойства только для чтения в анонимных объектах, поэтому, пока ваше выражение создает значения правильного типа, свойство join - вы должны быть в порядке.