SqlFunctions.StringConvert和Dynamic linq

时间:2013-02-12 08:22:43

标签: linq dynamic

我想在我的EF Dynamic Linq查询中转换一个Int64字段。 这是因为我想使用teh Contains函数来检查Int64是否包含一定数量的数字。 所以我使用SqlFunctions.StringConvert之类的

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

动态库引发ParseException:类型'SqlFunctions'中不存在适用的方法'StringConvert'。

我在动态库中更改了此数组,因此将定义SqlFunction:

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

奇怪的是:我还添加了EntityFunctions,并且工作正常,例如:

EntityFunctions.TruncateTime(LastCommentDate) = @0

更新:SqlFunctions不支持Int64:

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);

2 个答案:

答案 0 :(得分:1)

以下是我使用EF Dynamic Linq查询扩展在我的项目中使用SqlFunctions.StringConvert所做的工作。

这是我试图开始工作的代码行,当我遇到同样的问题,但我的“Property”是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;

我知道这看起来像是一个hack而且它是,但问题是库无法选择哪种方法

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

更好,因此我强制其手(以及具有相同签名的任何其他方法)使其使用Int32到Decimal的表达式转换,或者在您的情况下使用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;
    }

希望这会有所帮助......

答案 1 :(得分:0)

我认为首先将它转换为double(或十进制)会更容易,因为它们here然后进行转换(你可能会有溢出,因为这些float类型无法处理相同数量的值作为Int64)

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