2

我编写了以下函数来获取有关帐户或联系人的 SharePointDocumentLocation 记录。然而,即使我提供了一个 id,它肯定有一个与 SPDL 记录相关联的记录,但返回的 EntityCollection 的计数结果始终为 0。为什么我的查询不返回 SPDL 记录?

internal static EntityCollection GetSPDocumentLocation(IOrganizationService service, Guid id)
{
    SharePointDocumentLocation spd = new SharePointDocumentLocation();
    QueryExpression query = new QueryExpression
    {
        EntityName = "sharepointdocumentlocation",
        ColumnSet = new ColumnSet("sharepointdocumentlocationid"),
        Criteria = new FilterExpression
        {
            Conditions = 
            { 
                new ConditionExpression
                {
                    AttributeName = "regardingobjectid",
                    Operator = ConditionOperator.Equal,
                    Values = { id }
                }
            }
        }
    };
    return service.RetrieveMultiple(query);
}

以下代码确实有效

using System;
using Microsoft.Xrm.Sdk;
using Microsoft.Xrm.Sdk.Client;
using System.ServiceModel.Description;
using System.Net;
using Microsoft.Xrm.Sdk.Query;

namespace CRMConsoleTests
{
    class Program
    {
        static void Main(string[] args)
        {
            ClientCredentials credentials = new ClientCredentials();
            credentials.Windows.ClientCredential = CredentialCache.DefaultNetworkCredentials;
            Uri orgUri = new Uri("http://localhost/CRMDEV2/XRMServices/2011/Organization.svc");
            Uri homeRealmUri = null;
            using (OrganizationServiceProxy service = new OrganizationServiceProxy(orgUri, homeRealmUri, credentials, null))
            {
                //ConditionExpression ce = new ConditionExpression("regardingobjectid", ConditionOperator.Equal, new Guid(""));
                QueryExpression qe = new QueryExpression("sharepointdocumentlocation");
                qe.ColumnSet = new ColumnSet(new String[] { "sharepointdocumentlocationid", "regardingobjectid" });
                //qe.Criteria.AddCondition(ce);

                EntityCollection result = service.RetrieveMultiple(qe);

                foreach (Entity entity in result.Entities)
                {
                    Console.WriteLine("Results for the first record: ");
                    SharePointDocumentLocation spd = entity.ToEntity<SharePointDocumentLocation>();
                    if (spd.RegardingObjectId != null)
                    {
                        Console.WriteLine("Id: " + spd.SharePointDocumentLocationId.ToString() + " with RoId: " + spd.RegardingObjectId.Id.ToString());
                    }
                }
                Console.ReadLine();
            }
        }
    }
}

它检索 4 条记录,当我调试上面的插件代码时,它检索 3 条记录。

4

1 回答 1

4

你的一切看起来都很好QueryExpression,虽然我会写得更简洁一点(像这样):

var qe = new QueryExpression(SharePointDocumentLocation.EntityLogicalName){
    ColmnSet = new ColumnSet("sharepointdocumentlocationid"),
};
qe.Criteria.AddCondition("regardingobjectid", ConditionOperator.Equal, id);

因为我看不出有什么问题QueryExpression导致我有两个猜测。

  1. 您在 上使用模拟,IOrganizationService而被模拟的用户没有SharePointDocumentLocation. 你不会得到错误,你只是不会得到任何返回的记录。

  2. 您传入的 id 不正确。

我会删除Criteria并查看您返回多少记录。如果您没有取回所有记录,则您知道您的问题在于猜测 #1。

如果您获得所有记录,则将 添加regardingobjectidColumnSet并检索第一个没有任何记录的记录Criteria,然后调用此方法并传入您返回QueryExpression的 id 。regardingobject如果在添加regardingobjectid约束时没有收到任何内容,则说明有其他问题。

更新

由于这是在插件的删除中执行的,因此它必须在您的插件触发之前执行其级联删除。您可以尝试预验证

现在想起来,它必须在Validation阶段执行级联实体的删除,因为如果其中一个无法删除,实体本身也无法删除。

于 2014-01-15T01:45:10.530 回答