- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在 SQL Server 中有下表:
产品属性
nvarchar(100)
nvarchar(200)
这是通过 Entity Framework 映射到我的类中的:
public class ProductAttribute
{
public string Name {get;set;}
public string Value {get;set;}
}
ProductAttributes
的某些行具有以下形式:
{名称:“RAM”,值:“8 GB”},{名称:“缓存”,值:“3000KB”}
我需要动态构建一个可转换为 SQL 的 ExpressionTree,它可以执行以下操作:
如果值以数字开头,后跟或不后跟字母数字字符串,则提取该数字并将其与给定值进行比较
double value = ...;
Expression<Func<ProductAttribute, bool>> expression = p =>
{
Regex regex = new Regex(@"\d+");
Match match = regex.Match(value);
if (match.Success && match.Index == 0)
{
matchExpression = value.Contains(_parserConfig.TokenSeparator) ?
value.Substring(0, value.IndexOf(_parserConfig.TokenSeparator)) :
value;
string comparand = match.Value;
if(double.Parse(comparand)>value)
return true;
}
return false;
}
真正令人讨厌的是我需要动态构建这个表达式树。
到目前为止,我已经做到了这一点(它将值视为小数而不是字符串,因此它甚至不会尝试执行整个正则表达式):
private Expression GenerateAnyNumericPredicate(
Type type,
string valueProperty,
string keyValue,
double value) {
ParameterExpression param = Expression.Parameter(type, "s");
MemberExpression source = Expression.Property(param, valueProperty);
ConstantExpression targetValue = GetConstantExpression(value, value.GetType());
BinaryExpression comparisonExpression = Expression.GreaterThan(source, targetValue);
return Expression.Lambda(comparisonExpression, param);
}
编辑:在下面提供的帮助下,这是可行的:
Expression<Func<ProductSpecification, bool>> expo = ps=> ps.Value.Substring(0, (SqlFunctions.PatIndex("%[^0-9]%", ps.Value + ".") ?? 0) - 1) == "1000";
但我还需要转换为 double,然后进行数字比较:
Expression<Func<ProductSpecification, bool>> expo = ps=> double.Parse(ps.Value.Substring(0, (SqlFunctions.PatIndex("%[^0-9]%", ps.Value + ".") ?? 0) - 1)) > 1000;
显然这不能转换为 SQL:double.Parse()
。
我如何构造转换以便从我的表达式中将其解析为 SQL?
最佳答案
我认为 Yacoub Massad 询问 SQL 应该是什么样子是有道理的。如果没有办法编写执行查询的 SQL,怎么可能有转换为所需 SQL 的表达式树?
主要问题是 SQL Server 本身不支持正则表达式。您可以将 CLR 函数导入数据库并在 UDF 中使用它,但这并不是使其与 EF 一起工作的最简单方法。
因此,同样地,从想象可以完成这项工作的 SQL 开始。
现在我找到了this从字符串中提取数字(左)部分的小 gem:
select left(@str, patindex('%[^0-9]%', @str+'.') - 1)
这将从“3000KB”返回“3000”。
幸运的是,我们可以使用SqlFunctions.PatIndex
在 LINQ 语句中重现此内容:
from pa in context.ProductAttributes
select pa.Value.Substring(0, (SqlFunctions.PatIndex("%[^0-9]%", pa.Value + ".") ?? 0) - 1)
这显然会从您的示例中返回 8
和 3000
。
现在困难的部分已经完成,您可以使用此结果将谓词应用于此数字部分:
from pa in context.ProductAttributes
let numPart = pa.Value.Substring(0, (SqlFunctions.PatIndex("%[^0-9]%", pa.Value + ".") ?? 0) - 1)
where numPart .... // go ahead
你会看到,每次在 LINQ 语句中使用 numPart
时,整个 PatIndex
内容都会在 SQL 语句中重复(即使你换行它在子查询中)。不幸的是,这就是 SQL 的工作原理。它不能存储临时的报表内结果。好吧,语言规范已有 40 多年历史,一点也不差。
关于c# - 构建可动态转换为有效 SQL 的表达式树,可以将字符串与 double 值进行比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38446268/
如何使用 SPListCollection.Add(String, String, String, String, Int32, String, SPListTemplate.QuickLaunchO
我刚刚开始使用 C++ 并且对 C# 有一些经验,所以我有一些一般的编程经验。然而,似乎我马上就被击落了。我试过在谷歌上寻找,以免浪费任何人的时间,但没有结果。 int main(int argc,
这个问题已经有答案了: In Java 8 how do I transform a Map to another Map using a lambda? (8 个回答) Convert a Map>
我正在使用 node + typescript 和集成的 swagger 进行 API 调用。我 Swagger 提出以下要求 http://localhost:3033/employees/sear
我是 C++ 容器模板的新手。我收集了一些记录。每条记录都有一个唯一的名称,以及一个字段/值对列表。将按名称访问记录。字段/值对的顺序很重要。因此我设计如下: typedef string
我需要这两种方法,但j2me没有,我找到了一个replaceall();但这是 replaceall(string,string,string); 第二个方法是SringBuffer但在j2me中它没
If string is an alias of String in the .net framework为什么会发生这种情况,我应该如何解释它: type JustAString = string
我有两个列表(或字符串):一个大,另一个小。 我想检查较大的(A)是否包含小的(B)。 我的期望如下: 案例 1. B 是 A 的子集 A = [1,2,3] B = [1,2] contains(A
我有一个似乎无法解决的小问题。 这里...我有一个像这样创建的输入... var input = $(''); 如果我这样做......一切都很好 $(this).append(input); 如果我
我有以下代码片段 string[] lines = objects.Split(new string[] { "\r\n", "\n" }, StringSplitOptions.No
这可能真的很简单,但我已经坚持了一段时间了。 我正在尝试输出一个字符串,然后输出一个带有两位小数的 double ,后跟另一个字符串,这是我的代码。 System.out.printf("成本:%.2
以下是 Cloud Firestore 列表查询中的示例之一 citiesRef.where("state", ">=", "CA").where("state", "= 字符串,我们在Stack O
我正在尝试检查一个字符串是否包含在另一个字符串中。后面的代码非常简单。我怎样才能在 jquery 中做到这一点? function deleteRow(locName, locID) { if
这个问题在这里已经有了答案: How to implement big int in C++ (14 个答案) 关闭 9 年前。 我有 2 个字符串,都只包含数字。这些数字大于 uint64_t 的
我有一个带有自定义转换器的 Dozer 映射: com.xyz.Customer com.xyz.CustomerDAO customerName
这个问题在这里已经有了答案: How do I compare strings in Java? (23 个回答) 关闭 6 年前。 我想了解字符串池的工作原理以及一个字符串等于另一个字符串的规则是
我已阅读 this问题和其他一些问题。但它们与我的问题有些无关 对于 UILabel 如果你不指定 ? 或 ! 你会得到这样的错误: @IBOutlet property has non-option
这两种方法中哪一种在理论上更快,为什么? (指向字符串的指针必须是常量。) destination[count] 和 *destination++ 之间的确切区别是什么? destination[co
This question already has answers here: Closed 11 years ago. Possible Duplicates: Is String.Format a
我有一个Stream一个文件的,现在我想将相同的单词组合成 Map这很重要,这个词在 Stream 中出现的频率. 我知道我必须使用 collect(Collectors.groupingBy(..)
我是一名优秀的程序员,十分优秀!