1

我正在尝试使用 Linq 检索实体的所有记录,条件是参数中为真的属性之一在记录中为真。

我正在尝试实现逻辑“或”,请查看代码,因为它会更有意义。

在 FetchXML 中它正在工作:

public void GetLock(bool account = false, bool contact = false, bool incident = false)
{
    var fetch = @"
                <fetch mapping='logical'>
                    <entity name='de_processimport'>
                        <attribute name='de_processimportid' />
                            <filter type='or'>";
    if (account)
        fetch += @"<condition attribute='de_processingaccount' operator='eq' value='true' />";
    if (contact)
        fetch += @"<condition attribute='de_processingcontact' operator='eq' value='true' />";
    if (incident)
        fetch += @"<condition attribute='de_processingincident' operator='eq' value='true' />";
    fetch += @" 
                </filter>
            </entity>
        </fetch>";
    var processing = service.RetrieveMultiple(new FetchExpression(fetch));
    ...
}

在 Linq 中它不起作用:

public void GetLock(bool account = false, bool contact = false, bool incident = false)
{
    var processing = linq.de_processimportSet
        .Where(p => // get records that are processing the entities we are processing
        (account) ? p.de_ProcessingAccount == true : false // get processImport records where processingAccount is true or otherwise ignore this clause (false)
        || (contact) ? p.de_ProcessingContact == true : false
        || (incident) ? p.de_ProcessingIncident == true : false
        );
    ...
}
4

1 回答 1

1

CRM 读取创建的 Linq 语句,非常讲究。这应该对您有用,因为该集合是 IQueryable 类型的,您可以根据需要添加您的 where 语句:

public void GetLock(bool account = false, bool contact = false, bool incident = false)
{
    var query = linq.de_processimportSet;

    if(account){
        query = query.Where(p => p.de_ProcessingAccount);
    }

    if(contact){
        query = query.Where(p => p.de_ProcessingContact);
    }

    if(incident){
        query = query.Where(p => p.de_ProcessingIncident);
    }

    var processing = query.ToList();
}

编辑

CRM 的 Linq 不支持此功能,但您可以下载 LinqKit 并使用它的谓词构建器和AsExpandable魔法使其工作。 在此处查看类似的示例

在这种情况下,您也可以放弃 Linq 并使用查询表达式:

public void GetLock(bool account = false, bool contact = false, bool incident = false)
{
    var qe = new QueryExpression("de_processimport");
    qe.ColumnSet = new ColumnSet(true);

    if(account){
        qe.AddCondition("de_processingaccount" ConditionOperator.Equal, true);
    }

    if(contact){
        qe.AddCondition("de_processingcontact" ConditionOperator.Equal, true);
    }

    if(incident){
        qe.AddCondition("de_processingincident" ConditionOperator.Equal, true);
    }

    var processing = service.RetrieveMultiple(qe).Entities.Select(c => c.ToEntity<de_processimport>());
}
于 2013-09-05T13:21:29.053 回答