I've created an overloaded generic AddChildLink method that correctly handles this issue so that the link gets added correctly within the query expression. I've also added some overloads that default some of the parameters.
/// <summary>
/// Created do to possible bug (http://stackoverflow.com/questions/10722307/why-does-linkentity-addlink-initialize-the-linkfromentityname-with-its-own-lin)
/// Adds the new LinkEntity as a child to this LinkEnity, rather than this LinkEntity's LinkFrom Entity
/// Assumes that the linkFromAttributeName and the linkToAttributeName are the same
/// </summary>
/// <param name="link"></param>
/// <param name="linkToEntityName"></param>
/// <param name="linkAttributesName"></param>
/// <returns></returns>
public static LinkEntity AddChildLink(this LinkEntity link, string linkToEntityName, string linkAttributesName)
{
return link.AddChildLink(linkToEntityName, linkAttributesName, linkAttributesName);
}
/// <summary>
/// Created do to possible bug (http://stackoverflow.com/questions/10722307/why-does-linkentity-addlink-initialize-the-linkfromentityname-with-its-own-lin)
/// Adds the new LinkEntity as a child to this LinkEnity, rather than this LinkEntity's LinkFrom Entity
/// Assumes that the linkFromAttributeName and the linkToAttributeName are the same
/// </summary>
/// <param name="link"></param>
/// <param name="linkToEntityName"></param>
/// <param name="linkAttributesName"></param>
/// <param name="joinType"></param>
/// <returns></returns>
public static LinkEntity AddChildLink(this LinkEntity link, string linkToEntityName, string linkAttributesName, JoinOperator joinType)
{
return link.AddChildLink(linkToEntityName, linkAttributesName, linkAttributesName, joinType);
}
/// <summary>
/// Created do to possible bug (http://stackoverflow.com/questions/10722307/why-does-linkentity-addlink-initialize-the-linkfromentityname-with-its-own-lin)
/// Adds the new LinkEntity as a child to this LinkEnity, rather than this LinkEntity's LinkFrom Entity
/// </summary>
/// <param name="link"></param>
/// <param name="linkToEntityName"></param>
/// <param name="linkFromAttributeName"></param>
/// <param name="linkToAttributeName"></param>
/// <returns></returns>
public static LinkEntity AddChildLink(this LinkEntity link, string linkToEntityName,
string linkFromAttributeName, string linkToAttributeName)
{
return link.AddChildLink(linkToEntityName, linkFromAttributeName, linkToAttributeName, JoinOperator.Inner);
}
/// <summary>
/// Created do to possible bug (http://stackoverflow.com/questions/10722307/why-does-linkentity-addlink-initialize-the-linkfromentityname-with-its-own-lin)
/// Adds the new LinkEntity as a child to this LinkEnity, rather than this LinkEntity's LinkFrom Entity
/// </summary>
/// <param name="link"></param>
/// <param name="linkToEntityName"></param>
/// <param name="linkFromAttributeName"></param>
/// <param name="linkToAttributeName"></param>
/// <returns></returns>
public static LinkEntity AddChildLink(this LinkEntity link, string linkToEntityName,
string linkFromAttributeName, string linkToAttributeName, JoinOperator joinType)
{
var child = new LinkEntity(
link.LinkToEntityName, linkToEntityName,
linkFromAttributeName, linkToAttributeName, joinType);
link.LinkEntities.Add(child);
return child;
}
public static LinkEntity AddLink(this QueryExpression qe, string linkToEntityName, string linkAttributesName)
{
return qe.AddLink(linkToEntityName, linkAttributesName, linkAttributesName);
}
public static LinkEntity AddLink(this QueryExpression qe, string linkToEntityName, string linkAttributesName, JoinOperator joinType)
{
return qe.AddLink(linkToEntityName, linkAttributesName, linkAttributesName, joinType);
}
This shortens method and allows for chaining:
var qe = new QueryExpression("new_entitya");
qe.AddLink("new_entityb", "new_entitybid").
AddChildLink("new_entityc", "new_entitybid").
LinkCriteria.AddCondition("new_entitycid", ConditionOperator.Equal, id);