2

我有以下容器类:

public class AssetAndItsDepositsContainer
    {
        public jp_asset Asset { get; set; }
        public jp_deposit Deposit { get; set; }
    }

有没有办法采用以下 LINQ 查询:

from a in serviceContext.jp_assetSet
join d in serviceContext.jp_depositsSet on a.Id equals d.jp_assetid.Id
where a.statecode == jp_assetState.Active &&
      a.jp_isonhold = true
select new AssetAndItsDepositsContainer()
{
     Asset = a,
     Deposit = d
})
.ToList();

并通过使用“翻译”它QueryExpression?到目前为止,这是我想出的,但我不知道如何模仿这种select new表达方式:

QueryExpression query = new QueryExpression(jp_asset.EntityLogicalName);
query.ColumnSet = new ColumnSet(true);

query.Criteria.AddCondition("statecode", ConditionOperator.Equal, (int)jp_assetState.Active);
query.Criteria.AddCondition("jp_isonhold", ConditionOperator.Equal, true);
LinkEntity link = query.AddLink(jp_deposit.EntityLogicalName, "Id", "jp_assetid", JoinOperator.Inner);

// Now what?
var res = service.RetrieveMultiple(query).Entities; // gets only jp_assets
4

2 回答 2

1

您实际上可以Entity从链接实体构造有效对象。唯一的要求是链接实体的主键必须在结果集中可用。

因此,您的代码片段可以像这样扩展:

var query = new QueryExpression(jp_asset.EntityLogicalName);
query.ColumnSet.AllColumns = true;
query.Criteria.AddCondition("statecode", ConditionOperator.Equal, (int)jp_assetState.Active);
query.Criteria.AddCondition("jp_isonhold", ConditionOperator.Equal, true);

LinkEntity link = query.AddLink(jp_deposit.EntityLogicalName, "Id", "jp_assetid", JoinOperator.Inner);
link.EntityAlias = "d";
link.Columns.AddColumns("jp_depositid", "jp_name");

IEnumerable<Entity> deposits = Service.RetrieveMultiple(query).Entities
    .Select(e => new Entity("jp_deposit")
    {
        Id = (Guid)e.GetAttributeValue<AliasedValue>("d.jp_depositid").Value,
        ["jp_name"] = e.GetAttributeValue<AliasedValue>("d.jp_name")?.Value
    });

笔记

上面的示例仅对内部连接有效。在结果集中,链接实体的主键 (ID) 将始终可用。.Value因此使用语法获取它的值是安全的。可以使用 检索所有其他属性值?.Value

对于左连接,您需要先过滤结果集,然后再执行Select.

于 2017-08-25T20:59:02.853 回答
1

您不能访问整个LinkEntity,您只能访问其属性作为AliasedValueEntity本身的属性。

我只需检索您要查找的第二条记录的 ID 作为 an 的一部分,EntityReference然后执行 a Retrieve

于 2017-07-03T12:13:14.577 回答