我想将所有查询从QueryExpression更改为Linq。在开发时,所有似乎都很好,但我总是在运行时获得强制转换异常(不能将Microsoft.xrm.sdk.entity转换为Xrm.SystemUser - > Xrm是使用CrmSvcUtil生成的早期绑定类)。
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);
}
答案 0 :(得分:4)
我遇到了LINQ-to-CRM的类似问题并回到了QueryExpressions,因为它们有效,直到我在寻找其他东西时在某些SDK示例中找到了解决方案:您需要向您添加ProxyTypesBehavior
IOrganizationService
对象。我不知道它做了什么,但这肯定是允许我在早期绑定类中使用LINQ的变化(因为我认为,LINQ-to-CRM可以仅与早期约束类。)
因此,创建IOrganizationService
后您需要的行是:
organizationService.ServiceConfiguration.CurrentServiceEndpoint.Behaviors.Add(new ProxyTypesBehavior());
我希望有所帮助。
答案 1 :(得分:0)
它返回一个Entity对象,因此如果需要System User对象,则需要调用ToEntity()。以下内容适用于您:
var context = new OrganizationServiceContext(crmService);
SystemUser x = (from c in context.CreateQuery<SystemUser>()
where (string)c["DomainName"] == @"pfgc\" + Environment.UserName
select c).FirstOrDefault().ToEntity<SystemUser>();