2013-02-12 60 views
1

我有一个Int64字段,我想在我的EF动态Linq查询中进行转换。 这是因为我想使用包含函数来检查Int64是否包含一定数量的数字。 所以我用的是SqlFunctions.StringConvert像SqlFunctions.StringConvert和Dynamic linq

SqlFunctions.StringConvert(MyField).Contains("2012") 

动态库提出了一个ParseException:“StringConvert”不存在任何可用的方法是在类型“SqlFunctions”。

我在动态库而改变这个数组所以SqlFunctions将被定义:

static readonly Type[] predefinedTypes = { 
     typeof(Object), 
     ... 
     typeof(Math), 
     typeof(Convert), 
     typeof(EntityFunctions), 
     typeof(SqlFunctions) 
    }; 

奇怪的是:我还添加了EntityFunctions,而且做工精细,为例:

EntityFunctions.TruncateTime(LastCommentDate) = @0 

UPDATE :Int64不支持的SqlFunctions:

public static string StringConvert(decimal? number); 
public static string StringConvert(double? number); 
public static string StringConvert(decimal? number, int? length); 
public static string StringConvert(double? number, int? length); 
public static string StringConvert(decimal? number, int? length, int? decimalArg); 
public static string StringConvert(double? number, int? length, int? decimalArg); 

回答

1

这是我做了什么,以获得SqlFu nctions.StringConvert使用EF动态Linq查询扩展名在我的项目中工作。

下面是我尝试去工作的代码行,当我遇到同样的问题时,你有但我的“属性”是Int32而不是Int64。

query.Where("SqlFunctions.StringConvert(Property).Contains(\"12\")"); 

我添加以下代码行至CompareConversions方法

if (s == typeof (Int32) && t1 == typeof (Decimal?)) return 1; 

我猜,你想添加像下面这样的一线得到你的代码工作

if (s == typeof (Int64) && t1 == typeof (Decimal?)) return 1; 

我知道这看起来像一个黑客,它是,但问题是图书馆不能选择哪种方法

public static string StringConvert(decimal? number); 
public static string StringConvert(double? number); 

是更好的,所以我强迫它的手(和任何其他方法具有相同的签名)通过使Int32转换为表达式的十进制,或在您的情况下Int64到十进制转换。

下面是引用完成的方法

private static int CompareConversions(Type s, Type t1, Type t2) 
    { 
     if (t1 == t2) return 0; 
     if (s == t1) return 1; 
     if (s == t2) return -1; 
     bool t1t2 = IsCompatibleWith(t1, t2); 
     bool t2t1 = IsCompatibleWith(t2, t1); 
     if (t1t2 && !t2t1) return 1; 
     if (t2t1 && !t1t2) return -1; 
     if (IsSignedIntegralType(t1) && IsUnsignedIntegralType(t2)) return 1; 
     if (IsSignedIntegralType(t2) && IsUnsignedIntegralType(t1)) return -1; 
     // HACK: SqlFunctions.StringConvert - Force it to think the Decimal Signature 
     // is better than the double for Int32 
     if (s == typeof (Int32) && t1 == typeof (Decimal?)) return 1; 
     return 0; 
    } 

希望这有助于...

0

,我认为它会更容易先投它加倍(或十进制),因为他们做here然后做转换(你可以有一个可能的溢出,因为这些浮点类型不能处理与Int64相同数量的值)

query.Where("SqlFunctions.StringConvert((double)Property).Contains(\"12\")"); 
+0

动态LINQ是否识别'SqlFunctions'? – hakuna1811 2017-10-04 06:51:38