7

動的 linq select ステートメントで関数を呼び出そうとしていますが、エラーが発生します:

No property or field 'A' exists in type 'Tuple2'

コード例:

void Main()
{
    var a = new Tuple<int, int>(1,1);
    var b = new[]{ a };
    var q = b.AsQueryable().Select("A.Test(it.Item1)");

    q.Dump();
}

public static class A
{
    public static int Test(int i)
    {
        return i++;
    }
}

これを機能させるには、コードをどのように変更すればよいですか?

たとえば、組み込み関数を呼び出すと、正常に機能Convert.ToInt32します。

var q = b.AsQueryable().Select("Convert.ToInt32(it.Item1)");

また、動的 linq を使用してプロパティをキャストするにはどうすればよいですか?

var q = b.AsQueryable().Select("((float)it.Item1)");
4

7 に答える 7

7

これについてはすでに受け入れられている回答があることは知っていますが、私にはうまくいきませんでした。Dynamic Linq 1.1.4 を使用しています。このようなクエリを実行したかった

$.GetNewestRisk() == null

GetNewestRisk() は、$ で表されるオブジェクトのパブリック メソッドです。「クエリの実行中にエラーが発生しました。タイプ 'Patient' のメソッドにアクセスできません (インデックス 2)」というエラーが表示され続けました。

ソース コードには、使用する可能性のあるすべての型を保持するカスタム プロバイダーを割り当てることを可能にする GlobalConfig オブジェクトがあることがわかりました。カスタム プロバイダーのソース コードは次のとおりです。

public class CustomTypeProvider: IDynamicLinkCustomTypeProvider
{
    public HashSet<Type> GetCustomTypes()
    {
        HashSet<Type> types = new HashSet<Type>();
        types.Add(typeof(Patient));
        types.Add(typeof(RiskFactorResult));
        types.Add(typeof(PatientLabResult));
        types.Add(typeof(PatientVital));
        return types;
    }
}

これが私がそれを使用している方法です:

System.Linq.Dynamic.GlobalConfig.CustomTypeProvider = new CustomType();

この呼び出しを行った後、式内のオブジェクトでメソッドを呼び出すことができます。

于 2015-12-15T23:37:42.987 に答える
2

@Armand は、この問題に対する素晴らしい解決策をまとめました。これに関して私が見つけることができた唯一の解決策であるため、同じアプローチを試みる人のために追加したいと思います。

とマークされているクラスは...

[DynamicLinqType] 

... 次の行を実行するときは、考慮に入れる必要があります。

FindTypesMarkedWithDynamicLinqTypeAttribute(new[] { GetType().GetTypeInfo().Assembly })

上記のソリューションでは、評価される関数を含むクラスが、コードが現在存在する同じクラスにあることを前提としています。メソッドがそのクラスの外部で使用される場合は、アセンブリを変更する必要があります。

FindTypesMarkedWithDynamicLinqTypeAttribute(new[] { typeof(AnotherClassName).Assembly })

上記のソリューションから何も変更されていません。これは、使用しようとしている人のための明確化のためです。

于 2018-07-16T22:38:23.527 に答える