Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在LINQ的where子句中使用.NET字符串函数_C#_Linq_Dynamics Crm_Dynamics Crm 2013 - Fatal编程技术网

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

C# 在LINQ的where子句中使用.NET字符串函数,c#,linq,dynamics-crm,dynamics-crm-2013,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 =

如何在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"]};
这将导致以下错误:

无效的“where”条件。实体成员正在调用无效的属性或方法。

更新
生成实体类后,我在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实体时,这可能会破坏解决方案。

您可以使用SqlFunctions.StringConvert方法

这是msdn链接


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

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


在您的情况下,在查询中使用电话字符串之前,需要将其转换为正确的格式。但是,我看到您正在将一个常量字符串“1234567890”与之进行比较,因此,不要从动态对象中删除破折号,而是将破折号放入常量字符串中,例如
“123-456-7890
”,假设这是您的查询所建议的电话号码。

您不能这样做。Dynamics CRM LINQ提供程序不支持此功能,因为
QueryExpression
不支持此搜索

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

要执行此搜索,您需要在CRM中具有已清除的值。我以前在进行TAPI(电话)集成时遇到过这种问题。解决方案是在创建/更新时创建一个插件,对电话号码进行替换,并将值放入另一个字段(即“new_cleanphonenumber”),然后可以搜索该字段



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

如果此LINQ查询正在转换为SQL,则需要确保.NET函数可以转换为SQL函数。如果您只使用linq to对象,那么这里的功能就可以了。@JNYRanger有.Replace().NET函数是否可以转换为T-SQL的Replace()函数?我不这么认为。您应该在类中使用静态方法。您对EarlyBound实体的理解是不正确的。您可以随意使用早期绑定的实体,客户也可以添加他们想要的任何属性。他们唯一做不到的事情就是删除您引用的一个属性,在这种情况下,如果是早绑定或晚绑定,那么它将失败。所以省去你自己的麻烦,使用earlybound!(并不是说它有助于以任何方式解决这个问题)它是误导性的,但不是误导性的。显然,您必须重新生成类以引用刚刚添加到CRM中的内容。但是如果你不使用它,它会很好用的。早期绑定只是后期绑定实体的包装。正如StringConvert doucmentation所说,
返回从数字数据转换而来的字符数据。
它需要数字值作为参数。在我的例子中,[“xxxx”]是一个非数字类型的实体属性。返回错误
与'System.Data.Objects.SqlClient.SqlFunctions.StringConvert(double?)匹配的最佳重载方法'有一些无效参数
此列的数据库类型是什么?@Ali.NET SqlFunctions为您提供了许多基于数据库类型使用的函数。您可以相应地修改示例代码吗。我试图找到一个,但失败了。在db值转换中删除额外字符的要点是,用户在电话字段中输入的任何格式都应该转换为一个干净的数字,可以与给定的数字进行比较。当然,这个数字不是常数。我刚才用constant做了一个例子。@Ali.NET我有点这样想,但问题是,如果查询中有一部分是静态的,那么可以在查询之外进行。但是,如果你的数据不是标准化格式,Nicknow的答案听起来像是你的最佳选择。很抱歉,我没有告诉你你说的
如果你的查询中有一部分是静态的,那么可以在它之外进行
是的,我在用正确的词表达它时遇到了一些麻烦。你能发布你真正匹配的内容吗?我试着编一个例子,谢谢你。作为最后的选择,我想到了这个想法:)。但这不是一个理想的解决方案。好吧,我想澄清一下,Dynamics CRM LINQ Provider是基于QueryExpression的,真的吗?你能提供一些阅读资料来澄清我的理解吗?用SDK参考和引用更新了我的答案。关于QueryExpressions/LINQ查询中字符串操作函数的使用是否有任何更新?@KhadimAli-到目前为止没有任何更改,我预计不会有任何更改。为了使这样的查询有价值,必须在SQL查询本身中执行逻辑,这将增加错误代码过载服务器的可能性。在这一点上,这与产品目标相反。
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"] };