3

我正在尝试使用查询表达式生成这个基本的 SQL 语句:

SELECT *
FROM contact
INNER JOIN businessunit on contact.businessunitid = businessunit.businessunitid
INNER JOIN new_example on businessunit.new_exampleid = new_example.new_exampleid

使用此查询表达式测试:

var query = new QueryExpression("contact");
var bu = query.AddLink("businessunit", "businessunitid", "businessunitid");
var buChildLink = bu.AddLink("new_example", "new_exampleid", "new_exampleid");

Assert.AreEqual("businessunit", buChildLink.LinkFromEntityName); // Fails. Actual value is "contact"

解决方法是不使用 AddLink 方法,而是在您指定 LinkFromEntityName 的位置创建 LinkEntity,但我认为这是一个错误是错误的吗?

4

1 回答 1

1

我创建了一个重载的通用 AddChildLink 方法,可以正确处理此问题,以便在查询表达式中正确添加链接。我还添加了一些默认某些参数的重载。

/// <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);
}

这缩短了方法并允许链接:

var qe = new QueryExpression("new_entitya");
qe.AddLink("new_entityb", "new_entitybid").
    AddChildLink("new_entityc", "new_entitybid").
    LinkCriteria.AddCondition("new_entitycid", ConditionOperator.Equal, id);
于 2012-07-12T03:30:22.103 回答