我想将所有查询从 QueryExpression 更改为 Linq。在开发时,一切似乎都很好,但我总是在运行时遇到强制转换异常(无法将 Microsoft.xrm.sdk.entity 强制转换为 Xrm.SystemUser -> Xrm 是使用 CrmSvcUtil 生成的早期绑定(bind)类)。
var context = new OrganizationServiceContext(crmService);
SystemUser x = (from c in context.CreateQuery<SystemUser>()
where c.DomainName == @"pfgc\" + Environment.UserName
select c).FirstOrDefault();
这段代码很简单。我什至尝试过不使用 Where 子句,但它不会改变任何东西。
我尝试了以下(没有 FirstOrDefault 和 var 而不是 SystemUser)
var x = (from c in context.CreateQuery<SystemUser>()
where c.DomainName == @"pfgc\" + Environment.UserName
select c);
这不会引发异常,但 x 类型是 Microsoft.xrm.sdk.linq.Query。我究竟做错了什么?这似乎正是 SDK 所建议的。
编辑:
GCATNM 有正确答案。如果有人遇到同样的问题,这里有一个工作代码示例:
public SystemUser GetCurrentUser()
{
var context = GetOrgContext();
return (from c in context.CreateQuery<SystemUser>()
where c.DomainName == @"pfgc\" + Environment.UserName
select c).FirstOrDefault();
}
public OrganizationServiceContext GetOrgContext()
{
var serviceProxy1 = new OrganizationServiceProxy(organizationUri, homeRealmUri, credentials, null);
serviceProxy1.ServiceConfiguration.CurrentServiceEndpoint.Behaviors.Add(new ProxyTypesBehavior());
return new OrganizationServiceContext(serviceProxy1);
}
最佳答案
我在使用 LINQ-to-CRM 时遇到了类似的问题并返回到 QueryExpressions 因为它们有效,直到我在寻找其他东西时在一些 SDK 示例中找到解决方案:您需要添加 ProxyTypesBehavior
到您的 IOrganizationService
对象。我不知道它的作用,但这绝对是允许我将 LINQ 与早期绑定(bind)类一起使用的更改(据我所知,LINQ-to-CRM 可以仅与早期绑定(bind)类)。
因此,在创建 IOrganizationService
之后,您需要的行是:
organizationService.ServiceConfiguration.CurrentServiceEndpoint.Behaviors.Add(new ProxyTypesBehavior());
希望对您有所帮助。
关于c# - LinqToCRM 未正确转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5369502/