1

EF Dynamic Linq クエリで変換したい Int64 フィールドがあります。これは、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

更新: 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);
4

2 に答える 2

1

EF Dynamic Linq クエリ拡張機能を使用して、プロジェクトで SqlFunctions.StringConvert を機能させるために行ったことを次に示します。

これは、同じ問題に遭遇したときに作業しようとしていたコード行ですが、「プロパティ」は Int64 ではなく Int32 でした。

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 に答える