1

データベースの orm として FluentData を使用しており、一般的なクエリ メソッドを作成しようとしています。

internal static T QueryObject<T>(string sql, object[] param, Func<dynamic, T> mapper)
{
    return MyDb.Sql(sql, param).QueryNoAutoMap<T>(mapper).FirstOrDefault();
}

私のクラスの関数を除いて:

public class MyDbObject
{
    public int Id { get; set; }
}


public static MyDbObject mapper(dynamic row)
{
    return new MyDbObject {
    Id = row.Id
    };
}

public static MyDbObject GetDbObjectFromTable(int id)
{
    string sql = @"SELECT Id FROM MyTable WHERE Id=@Id";
    dynamic param = new {Id = id};
    return Query<MyDbObject>(sql, param, mapper); 
}

コンパイラでQuery<MyDbObject>(sql, param, mapper)次のように述べています。

An anonymous function or method group connot be used as a constituent value of a dynamically bound object.

誰でもこれが何を意味するのか分かりますか?

編集:

メソッドをデリゲートに変換しても、コンパイラは文句を言いません。

public static Func<dynamic, MyDbObject> TableToMyDbObject =
    (row) => new MyDbObject
                 {
                     Id = row.Id
                 }

なぜ一方の方法が有効で、もう一方の方法が有効でないのかという疑問が残ります。

4

2 に答える 2

5

問題は、エラーが示すとおりです...

匿名関数またはメソッドグループは、動的にバインドされた操作の構成値として使用できません。

これは、パラメーターの1つがType dynamicであるため、匿名関数を使用できないことを意味します。したがって、メソッドを修正するには、パラメーターを次のようにキャストするだけです。object

public static MyDbObject GetDbObjectFromTable(int id)
{
    string sql = @"SELECT Id FROM MyTable WHERE Id=@Id";

    dynamic param = new {Id = id}; // this Type dynamic is what causes the issue.

    // you could just fix with a cast to object
    return Query<MyDbObject>(sql, (object)param, mapper); 
}

または、おそらくあなたのコードを見ることから...単に。

    return Query<MyDbObject>(sql, id, mapper); 

Funcデリゲートを使用しても文句を言わないのは、動的型を使用してDLRを呼び出すことがないため、動的にバインドされた操作がないためです。

于 2012-12-17T08:27:54.937 に答える
-3

メソッドをデリゲートに変換しても、コンパイラは文句を言いません。

public static Func<dynamic, MyDbObject> TableToMyDbObject =
    (row) => new MyDbObject
                 {
                     Id = row.Id
                 }
于 2012-09-11T12:25:20.720 に答える