1

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

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

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

我在动态库中更改了这个数组,以便定义 SqlFunctions:

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

2 回答 2

1

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

当我遇到与您相同的问题时,这是我试图开始工作的代码行,但我的“属性”是 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 到 Decimal 的转换来表示表达式,或者在你的情况下是 Int64 到 Decimal 的转换。

这是完成的方法供参考

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

希望这可以帮助...

于 2013-05-03T19:04:04.667 回答
0

我认为首先将其转换为双精度(或十进制)会更容易,因为它们在这里做的然后进行转换(你可能有溢出,因为这些浮点类型不能处理与 Int64 相同数量的值)

query.Where("SqlFunctions.StringConvert((double)Property).Contains(\"12\")");
于 2016-10-29T21:10:53.363 回答