EF6 Dynamic Linq 将字符串转换为十进制

Posted

技术标签:

【中文标题】EF6 Dynamic Linq 将字符串转换为十进制【英文标题】:EF6 Dynamic Linq cast string to decimal 【发布时间】:2020-09-24 16:35:11 【问题描述】:

我首先在 System.Dynamic.Linq 中使用 EF6 代码。我试图弄清楚如何将字符串转换为十进制。基本上和这里要求的一样:Dynamic LINQ Cast issue

我的系统解析生成名称/值对的文件。这些作为 varchar 列存储在表中。这些值可以表示任何类型(字符串、整数、小数、日期时间等),因此我无法真正保存为实际数据类型,因此所有内容都存储为 varchar。

我在应用程序中有一个文本框,可让用户输入动态 linq 查询。例如,用户可能正在尝试这样做:

Name == "Test Value" && Value > 5.5

Name == "Other Value" && Value == "My String Value"

问题是我似乎无法在 Value 列上进行必要的转换。我目前主要对转换为十进制感兴趣,因为这是大多数数据。我尝试了一些我发现的建议:

    Convert.ToDecimal(Value):Linq to Entities 无法识别该方法 Decimal.Parse(Value):Linq to Entities 无法识别该方法 尝试实现 DbFunction (Example)。将其转换为十进制而不是 int。 ParseDecimal(Value):不存在适用的方法。显然,它正在业务对象本身上寻找该方法。

似乎是一件简单而常见的事情。我错过了什么?

【问题讨论】:

【参考方案1】:

一种解决方案可能是实现列表(因此您选择 Value 作为字符串)然后再次使用 LINQ Dynamic 执行另一个选择,但这一次,它将在应用程序端,因此您将不再是受 EF6 限制

var list = context.MyEntities.Select("[the dynamic select without conversion]")
                             .ToDynamicList()
                             .Select("[the dynamic select with conversion]")
                             .ToDynamicList();

【讨论】:

所以,换句话说,在内存中进行转换。但这会首先将所有数据拉到客户端。我不确定我真的想这样做。我希望通过某种方式来实现一个自定义函数,该函数同时适用于 EF6 和动态 linq。 不,您只能先选择您想要的字段,而无需在应用程序端进行转换。 这真的很糟糕。似乎是一个重大的疏忽。想象一下,仅仅因为您无法正确过滤而不得不提取数千兆字节的数据来查找一条记录:-/ 我想我的情况还不错,谢天谢地。因此,在 Convert.ToDecimal 之类的东西上,动态 linq 似乎理解这一点,只是 EF6 没有。有什么方法可以扩展 EF6 以理解这一点并生成 CAST/CONVERT SQL?

以上是关于EF6 Dynamic Linq 将字符串转换为十进制的主要内容,如果未能解决你的问题,请参考以下文章

使用 Linq 将所有字段转换为大写

将金额转换为十万和千万

无法将匿名类型从“System.Linq.IQueryable”转换为“System.Data.Entity.Core.Objects.ObjectQuery”

使用 linq 在一个 SQL 查询 (EF6) 中为多个数据库列选择可能的值

EF 6.x,LINQ-to-SQL和原始SQL子句

使用 EF6 优化 LINQ 查询