- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我一直在学习表达式并使用下面的代码添加构建针对数据库模型的表达式(EF4 - ORACLE 而不是 SQL!)
这对 Oracle 非常有效,并允许我动态地构建谓词,例如 "CustomerId", "Contains", 2
到 f=>f.CustomerId.ToString() 中。 ToLower().Contains("2")
但是,如果我尝试针对 SQL Server 然后它会失败,因为我需要调用 SqlFunctions.StringConvert
- 但我不知道如何将其包含在 Lambda 中?
我的最终结果是这样的:
f=> SqlFunctions.StringConvert(f.CustomerId).ToLower().Contains("2")
谢谢 :)
编辑:添加了我尝试过的示例
这段代码看起来几乎可以工作了,有点!
但是,它会在 var sqlExpression
行
Expression of type 'System.Double' cannot be used for parameter of type 'System.Nullable`1[System.Double]' of method 'System.String StringConvert(System.Nullable`1[System.Double])'
MethodInfo convertDouble = typeof(Convert).GetMethod("ToDouble",new Type[]{typeof(int)});
var cExp = Expression.Call(convertDouble, left.Body);
var entityParam = Expression.Parameter(typeof(TModel), "f");
MethodInfo sqlFunc = typeof(SqlFunctions).GetMethod("StringConvert", new Type[] { typeof(double) });
var sqlExpression = Expression.Call(sqlFunc, cExp);
MethodInfo contains = typeof(string).GetMethod("Contains", new[] { typeof(string) });
right = Expression.Constant(value.ToString(), typeof(string));
var result = left.AddToString().AddToLower().AddContains(value.ToString());
return result;
public static Expression<Func<T, string>> AddToString<T, U>(this Expression<Func<T, U>> expression)
{
return Expression.Lambda<Func<T, string>>(
Expression.Call(expression.Body,
"ToString",
null,
null),
expression.Parameters);
}
public static Expression<Func<T, string>> AddToLower<T>(this Expression<Func<T, string>> expression)
{
return Expression.Lambda<Func<T, string>>(
Expression.Call(expression.Body,
"ToLower",
null,
null),
expression.Parameters);
}
public static Expression<Func<T, bool>> AddContains<T>(this Expression<Func<T, string>> expression, string searchValue)
{
return Expression.Lambda<Func<T, bool>>(
Expression.Call(
expression.Body,
"Contains",
null,
Expression.Constant(searchValue)),
expression.Parameters);
}
最佳答案
我相信您基本上需要构建以下 lambda 表达式的等效表达式:
e => SqlFunctions.StringConvert((double?) e.Number).Contains("6"))
这是一个完整的复制粘贴示例。它使用 CodeFirst,因此无需创建数据库或类似的东西就可以工作。只需添加 Entity Framework nuget 包(我使用 EF6,但它也适用于 EF5)。构建 lambda 才是您真正想要的。
namespace ConsoleApplication8
{
public class MyEntity
{
public int Id { get; set; }
public int Number { get; set; }
}
public class MyContext : DbContext
{
public DbSet<MyEntity> Entities { get; set; }
}
class Program
{
static void Main(string[] args)
{
using (var ctx = new MyContext())
{
if (!ctx.Entities.Any())
{
ctx.Entities.Add(new MyEntity() {Number = 123});
ctx.Entities.Add(new MyEntity() {Number = 1893});
ctx.Entities.Add(new MyEntity() {Number = 46});
ctx.SaveChanges();
}
foreach(var entity in ctx.Entities.Where(e => SqlFunctions.StringConvert((double?) e.Number).Contains("6")))
{
Console.WriteLine("{0} {1}", entity.Id, entity.Number);
}
foreach (var entity in ctx.Entities.Where(BuildLambda<MyEntity>("Number", "6")))
{
Console.WriteLine("{0} {1}", entity.Id, entity.Number);
}
}
}
private static Expression<Func<T, bool>> BuildLambda<T>(string propertyName, string value)
{
var parameterExpression = Expression.Parameter(typeof(T), "e");
var stringConvertMethodInfo =
typeof(SqlFunctions).GetMethod("StringConvert", new Type[] {typeof (double?)});
var stringContainsMethodInfo =
typeof (String).GetMethod("Contains");
return
Expression.Lambda<Func<T, bool>>(
Expression.Call(
Expression.Call(
stringConvertMethodInfo,
Expression.Convert(
Expression.Property(parameterExpression, "Number"),
typeof (double?))),
stringContainsMethodInfo,
Expression.Constant(value)),
parameterExpression);
}
}
}
关于c# - 是否可以在 Lambda 表达式中包含 SqlFunctions.StringConvert?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13577981/
我正在尝试使用属性网格来显示数据。我必须为预定义的字符串常量编写 StringConverters,以便它们可以显示在组合框中。 考虑一个颜色列表和另一个角度列表 0,90,180,270。我想在网格
我正在尝试在 JavaFX 的表格中创建一个组合框表格单元格。我使用了字符串转换器,以便 false 在表中显示“否”,而 true 在表中显示"is",并且这是有效的。但是,当我单击单元格进行编辑时
我在创建可编辑的 ListView 时遇到了一些小问题。 所以我有一个包含两个字段的城市类:id 和 name,我从数据库中创建了一个城市 ObservableList 并将其分配给我的 ListVi
我在代码中有类似的东西 SqlFunctions.StringConvert( (double?) x.Latitude) 但它总是返回一个整数,尽管它有一个纬度值。 有什么帮助吗? 最佳答案 Sql
我正在将应用程序迁移到 .net 核心。但 SqlFunctions.StringConvert() 在 .netcore 中不起作用。 我正在使用以下代码: using (var entity =
在我的 ViewModel 中,我返回以下下拉列表: public IEnumerable Statuses { get { using
我有一个组合框,我想用数据库中的数据填充它。使用以下代码,ComboBox 中显示的数据是值的 ID,而不是 string 值。 (部分)Java Controller 代码: @FXML C
我一直在学习表达式并使用下面的代码添加构建针对数据库模型的表达式(EF4 - ORACLE 而不是 SQL!) 这对 Oracle 非常有效,并允许我动态地构建谓词,例如 "CustomerId",
对于数字输入,有时将模拟控件同步到文本显示会很方便。在这个 Swing 中example ,一个 JSpinner 和一个 JSlider 各自监听变化事件,并且各自更新对方的模型以匹配。一个类似的
当我在“Excel 应用范围”中创建“读取单元格”时,我尝试使用“写入行”从 Excel 中输出读取的数据。但是,它不起作用,它会输出标题中的错误。有人能补吗? 最佳答案 我遇到过同样的问题。我正在使
我正在使用 EF 4 并尝试使用 Moq 对以下行进行单元测试: var convertError = models .Where(x => SqlFunctions.Str
我有一个简单的 slider 和一个普通的标签。标签的内容绑定(bind)到 slider 的值并且工作正常 - 当您移动 slider 时,标签的内容会发生变化,例如 23.3983928394 、
问题 需要使用 EF4 + SQL CE4 将 int 转换为 string。使用 SqlFunctions.StringConvert(double) 的推荐选项仍然给我错误。 选项 1 (原来的)
在之前的SO question当我的 POCO 中有字符串属性时,我询问如何更改 MySql 列类型。 我自己回答的答案是实现我自己的 StringConverter。我认为这是一种可以接受的方法。
我不明白为什么会出现此错误。我已经在以前版本的 Entity Framework 中成功地使用了这个函数,但是我已经使用 EF6 设置了一个新项目并且它没有合作。 using System.Data;
我是一名优秀的程序员,十分优秀!