是否有可能包括SqlFunctions.StringConvert在Lambda表达式?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了是否有可能包括SqlFunctions.StringConvert在Lambda表达式?相关的知识,希望对你有一定的参考价值。
我一直在学习和表达的使用下面的代码添加建立对数据库模型的表达(EF4 - !不ORACLE,SQL)
这工作完全反对甲骨文,并让我动态建立谓语,如"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所以应该无需创建数据库或任何类似的工作。只需添加实体框架NuGet包(我用EF6但它应该对EF5工作以及)。建立拉姆达是你的真实意图。
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);
}
}
}
以上是关于是否有可能包括SqlFunctions.StringConvert在Lambda表达式?的主要内容,如果未能解决你的问题,请参考以下文章