public ResolvedJoinInfo ResolveJoinInfo (UnresolvedJoinInfo joinInfo, UniqueIdentifierGenerator generator)
{
if (joinInfo.MemberInfo.DeclaringType == typeof (Cook))
{
switch (joinInfo.MemberInfo.Name)
{
case "Substitution":
return CreateResolvedJoinInfo (
joinInfo.OriginatingEntity,
"ID",
typeof (int),
true,
CreateResolvedTableInfo (joinInfo.ItemType, generator),
"SubstitutedID",
typeof (int),
false);
case "Substituted":
return CreateResolvedJoinInfo (
joinInfo.OriginatingEntity,
"SubstitutedID",
typeof (int),
false,
CreateResolvedTableInfo (joinInfo.ItemType, generator),
"ID",
typeof (int),
true);
case "Assistants":
return CreateResolvedJoinInfo (
joinInfo.OriginatingEntity,
"ID",
typeof (int),
true,
CreateResolvedTableInfo (joinInfo.ItemType, generator),
"AssistedID",
typeof (int),
false);
case "Kitchen":
return CreateResolvedJoinInfo (
joinInfo.OriginatingEntity,
"KitchenID",
typeof (int),
false,
CreateResolvedTableInfo (joinInfo.ItemType, generator),
"ID",
typeof (int),
true);
case "Knife":
var joinedTableInfo = CreateResolvedTableInfo (joinInfo.ItemType, generator);
var leftKey = ResolveMemberExpression (joinInfo.OriginatingEntity, typeof (Cook).GetProperty ("KnifeID"));
var rightKey = ResolveSimpleTableInfo (joinedTableInfo, generator).GetIdentityExpression();
return new ResolvedJoinInfo (joinedTableInfo, Expression.Equal (leftKey, rightKey));
}
}
else if (joinInfo.MemberInfo.DeclaringType == typeof (Kitchen))
{
switch (joinInfo.MemberInfo.Name)
{
case "Cook":
return CreateResolvedJoinInfo (
joinInfo.OriginatingEntity,
"ID", typeof (int), true, CreateResolvedTableInfo (joinInfo.ItemType, generator), "KitchenID", typeof (int), false);
case "Restaurant":
return CreateResolvedJoinInfo (
joinInfo.OriginatingEntity,
"RestaurantID", typeof (int), false, CreateResolvedTableInfo (joinInfo.ItemType, generator), "ID", typeof (int), true);
}
}
else if (joinInfo.MemberInfo.DeclaringType == typeof (Restaurant))
{
switch (joinInfo.MemberInfo.Name)
{
case "SubKitchen":
return CreateResolvedJoinInfo (
joinInfo.OriginatingEntity,
"ID", typeof (int), true, CreateResolvedTableInfo (joinInfo.ItemType, generator), "RestaurantID", typeof (int), false);
case "Cooks":
return CreateResolvedJoinInfo (
joinInfo.OriginatingEntity,
"ID", typeof (int), true, CreateResolvedTableInfo (joinInfo.ItemType, generator), "RestaurantID", typeof (int), false);
case "CompanyIfAny":
return CreateResolvedJoinInfo (
joinInfo.OriginatingEntity,
"CompanyID",
typeof (int?),
false,
CreateResolvedTableInfo (joinInfo.ItemType, generator),
"ID",
typeof (int),
true);
}
}
else if (joinInfo.MemberInfo.DeclaringType == typeof (Company))
{
switch (joinInfo.MemberInfo.Name)
{
case "AllRestaurants":
return CreateResolvedJoinInfo (
joinInfo.OriginatingEntity,
"ID",
typeof (int), true, CreateResolvedTableInfo (joinInfo.ItemType, generator), "CompanyID", typeof (int?), false);
}
}
throw new UnmappedItemException ("Member " + joinInfo.MemberInfo + " is not a valid join member.");
}