LinkedEntity
в выражении запроса в точности похоже на внутреннее или внешнее соединение SQL (вы указываете тип соединения).он отлично подходит для извлечения отношений N: 1, он действительно не работает для N: N.
Для N: N вам нужно пройти через «сущность отношений».
Если вы хотите, чтобы все контракты были связаны с возможностью, вы должны извлечь все контакты, в которых есть строка, связывающая их с этой возможностью, в таблице «сущность отношения», «ccseq_opportunity_ccseq_contract» (я использую строковые константы ниже, потому что я нея не знаю, как вы строите свои классы сущностей).
var q = new QueryExpression("ccseq_contract") {
ColumnSet = new ColumnSet(true), //or specify what fields you want from ccseq_contract
LinkEntities = {
new LinkEntity() {
LinkFromEntityName = "ccseq_contract",
LinkToEntityName = "ccseq_opportunity_ccseq_contract",
ColumnSet = new ColumnSet(false), //don't fetch any fields from the link table
LinkCriteria = new FilterExpression() {
FilterOperator = LogicalOperator.And,
Conditions = {
new ConditionExpression("opportunityid", ConditionOperator.Equal, wonOpportunity.Id)
}
}
}
}
};
В качестве отступления, если вы не используете оператор запроса in, я бы действительно предпочел использовать запросы LINQ вместо выражений запросов., если вы создали строго типизированные классы сущностей.Запрос LINQ будет выглядеть как
using(var ctx = new OrganizationServiceContext(service)) {
var contracts = (
from c in ctx.CreateQuery<ccseq_contract>()
join lnk in ctx.CreateQuery<ccseq_opportunity_ccseq_contract>() on c.ccseq_contractId equals link.ccseq_contractId
where lnk.opportunityid = wonOpportunity.Id
select c
// Or, to fetch only some fields, do
// select new { c.ccseq_contractId, c.ccseq_name }
).ToList();
}