我构造了一个简单的查询来返回用户团队成员身份(N:N 关系)。 这对所有用户都有效,但是,当我添加一个 where 子句来限制特定用户时,它会抛出错误异常(请参阅下面的堆栈跟踪)。
奇怪的是,这适用于"Where Users.FullName.StartsWith("Alex")"。 Dynamics CRM SDK LINQ 实现是否不支持 where 子句中的指南?
有什么建议吗?
示例代码
using (var service = new OrganizationService("Xrm"))
{
using (var xrm = new XrmServiceContext(service))
{
var AlexUser = xrm.SystemUserSet.Where(p => p.FullName.StartsWith("Alex")).First();
var AlexID = AlexUser.Id;
var Test =
from Users in xrm.SystemUserSet
join TeamMemberships in xrm.TeamMembershipSet on Users.Id equals TeamMemberships.SystemUserId
join Teams in xrm.TeamSet on TeamMemberships.TeamId equals Teams.Id
where Users.Id == AlexID // <-- problematic where clause
orderby Users.FullName
select new
{
FullName = Users.FullName,
UserID = Users.Id,
TeamName = Teams.Name
};
var Test1 = Test.ToList();
}
}
堆栈跟踪:
服务器堆栈跟踪:在System.ServiceModel.Channels.ServiceChannel.HandleReply(ProxyOperationRuntime操作,ProxyRpc& rpc) atSystem.ServiceModel.Channels.ServiceChannel.Call(String action,布尔单向, ProxyOperationRuntime operation, Object[] ins,对象[] outs, TimeSpan timeout) atSystem.ServiceModel.Channels.ServiceChannel.Call(String action,布尔单向, ProxyOperationRuntime operation, Object[] ins,对象[] outs) atSystem.ServiceModel.Channels.ServiceChannelProxy.InvokeService(IMethodCallMessage方法调用,代理操作运行时操作) atSystem.ServiceModel.Channels.ServiceChannelProxy.Invoke(IMessage消息)
在 [0] 处重新引发异常:在System.Runtime.Remoting.Proxies.RealProxy.HandleReturnMessage(IMessagereqMsg, IMessage retMsg) atSystem.Runtime.Remoting.Proxies.RealProxy.PrivateInvoke(MessageData&msgData, Int32 type) atMicrosoft.Xrm.Sdk.IOrganizationService.Execute(OrganizationRequest请求)在Microsoft.Xrm.Sdk.Client.OrganizationServiceProxy.ExecuteCore(OrganizationRequest请求)在Microsoft.Xrm.Sdk.Client.OrganizationServiceProxy.Execute(OrganizationRequest请求)在Microsoft.Xrm.Client.Services.OrganizationService.<>c__DisplayClass19.b__18(IOrganizationServices) 在Microsoft.Xrm.Client.Services.OrganizationService.InnerOrganizationService.UsingService[TResult](Func
2 action) at Microsoft.Xrm.Client.Services.OrganizationService.Execute(OrganizationRequest request) at Microsoft.Xrm.Sdk.Client.OrganizationServiceContext.Execute(OrganizationRequest request) at Microsoft.Xrm.Sdk.Linq.QueryProvider.RetrieveEntityCollection(OrganizationRequest request, NavigationSource source) at Microsoft.Xrm.Sdk.Linq.QueryProvider.Execute(QueryExpression qe, Boolean throwIfSequenceIsEmpty, Boolean throwIfSequenceNotSingle, Projection projection, NavigationSource source, List
1 linkLookups,String&pagingCookie, Boolean&moreRecords) atMicrosoft.Xrm.Sdk.Linq.QueryProvider.Execute[TElement](QueryExpressionqe, Boolean throwIfSequenceIsEmpty, Boolean throwIfSequenceNotSingle,投影投影、导航源源、列表1 linkLookups) at Microsoft.Xrm.Sdk.Linq.QueryProvider.Execute[TElement](Expression expression) at Microsoft.Xrm.Sdk.Linq.QueryProvider.GetEnumerator[TElement](Expression expression) at Microsoft.Xrm.Sdk.Linq.Query
1.GetEnumerator() atSystem.Collections.Generic.List1..ctor(IEnumerable
1 collection)
at System.Linq.Enumerable.ToList[TSource](IEnumerable'1 source) ataspirets.crm.test.Program.Main(String[] args) inC:\Users\a_marshall\documents\visual studio2010\Projects\aspirets.crm\aspirets.crm.test\Program.cs:line 37 atSystem.AppDomain._nExecuteAssembly(RuntimeAssembly assembly, String[]args) at System.AppDomain.ExecuteAssembly(String assemblyFile,Evidence assemblySecurity, String[] args) atMicrosoft.VisualStudio.HostingProcess.HostProc.RunUsersAssembly()
at System.Threading.ThreadHelper.ThreadStart_Context(对象状态)
at System.Threading.ExecutionContext.Run(ExecutionContextexecutionContext, ContextCallback callback, Object state, BooleanignoreSyncCtx) atSystem.Threading.ExecutionContext.Run(ExecutionContextexecutionContext, ContextCallback callback, Object state) atSystem.Threading.ThreadHelper.ThreadStart()
不要Users.Id
,而是尝试Users.SystemUserId
。同样,不要Teams.Id
,请尝试Teams.TeamId
。
至于这起作用的原因,我不知道有任何文档说明这一点,但是因为生成的早期绑定文件中的实体继承自Entity
,它们必须具有Id
属性。但是,由于早期绑定OrganizationServiceContext
将实体属性直接映射到 CRM 数据库(其表不包含Id
列),因此将 Id
属性与 LINQ 提供程序一起使用将不起作用,因此您必须使用实际的数据库/架构名称。