2017-07-03 37 views
2

我有以下容器类:翻译LINQ查询到CRM QueryExpression同时使用“选择新的”

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 

回答

1

您不能访问整个LinkEntity,你只能访问它的属性为AliasedValue性能上主要是Entity本身。

我会简单地检索您要查找的第二条记录的ID,作为EntityReference的一部分,然后执行Retrieve

+0

你的回答不正确。鉴于我们可以访问'LinkEntity'的属性,我们完全可以从结果集中构建'Entity'对象。只需使用LINQ表达式的“选择”方法。 –

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之前,您需要先筛选结果集。