在LINQ的where子句中使用.NET字符串函数

时间:2015-02-26 15:48:47

标签: c# linq dynamics-crm dynamics-crm-2013

如何在LINQ查询中使用.NET框架字符串函数?

var accounts = from a in orgContext.CreateQuery("account")
                      where a["telephone1"].ToString().Replace("-","") == "1234567890"
                      orderby a["name"]
                      select new { id = a["accountid"], name = a["name"], telephone1 = a["telephone1"]};

这最终会出现错误:

Invalid 'where' condition. An entity member is invoking an invalid property or method.

更新
在创建实体类之后,我在SQL Server中对测试数据库尝试了这个LINQ查询,并且它成功返回结果:

from Account in db.Account
where Account.Telephone1.Replace("-", "").Substring(Account.Telephone1.Replace("-", "").Length - 10, 10) == "1234567890"
select new {
  Account.AccountId,
  Account.Name,
  Account.Telephone1
}

但是,由于我在使用后期绑定实体的Dynamics CRM中进行LINQ查询,如第一个代码示例所示(项目中没有实体类),应用程序最终会出现运行时错误。

PS:我无法使用早期绑定实体,因为当客户将任何属性添加到Dynamics CRM实体时,这可能会破坏解决方案。

3 个答案:

答案 0 :(得分:4)

您可以使用SqlFunctions.StringConvert方法。

这是msdn链接https://msdn.microsoft.com/en-us/library/dd466166.aspx

var accounts = from a in orgContext.CreateQuery("account")
                                  where SqlFunctions.StringConvert(a["telephone1"]).Replace("-","") == "1234567890"
                                  orderby a["name"]
                                  select new { id = a["accountid"], name = a["name"], telephone1 = a["telephone1"] };

答案 1 :(得分:3)

你不能这样做。 Dynamics CRM LINQ Provider不支持此功能,因为QueryExpression不支持此搜索。

https://msdn.microsoft.com/en-us/library/gg334607.aspx

  

查询是使用标准语言构建的,但在内部使用   QueryExpression因此仅限于QueryExpression的功能。

要执行此搜索,您需要在CRM中具有已清理的值。我以前在做TAPI(电话)集成时遇到过这个问题。解决方案是在Create / Update上创建一个插件,用于替换电话号码并将值放在不同的字段中(即“new_cleanphonenumber”),然后可以搜索它。

您可以使用相同的清理代码编写一个简单的命令行实用程序来完成并更新所有现有值。

答案 2 :(得分:1)

您的查询的这一部分:a["telephone1"].ToString().Replace("-","")无法转换为有效的SQL语句或任何基础域语言。使用linq-to-entities时,如果不是基于SQL,则需要在基础数据库的SQL风格或实体的域语言中表示查询。使用linq-to-objects时,情况并非如此,您的查询将是有效的。

您可以在linq-to-entity查询中使用SqlFunctions中的静态方法,但正如您已经注意到的那样,您实际上没有很多字符串操作选项。此外,您的底层实体是dynamics-crm,所以除非您直接连接到SQL数据库,否则您可能无法使用SQL语句。

在您的情况下,您需要先将电话字符串转换为正确的格式,然后再在查询中使用它。但是,我看到你要比较一个"1234567890"的常量字符串,所以不要从动态对象中删除破折号,而是将破折号放入常量字符串,例如"123-456-7890“,假设这是一个电话您的查询建议的数字。