Dus*_*gen 1 c# orm delegates fluentdata
我将FluentData用作数据库的orm,并尝试创建通用查询方法:
internal static T QueryObject<T>(string sql, object[] param, Func<dynamic, T> mapper)
{
return MyDb.Sql(sql, param).QueryNoAutoMap<T>(mapper).FirstOrDefault();
}
Run Code Online (Sandbox Code Playgroud)
除了我班上的职能:
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);
}
Run Code Online (Sandbox Code Playgroud)
在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
}
Run Code Online (Sandbox Code Playgroud)
它仍然引出一个问题,为什么一种方法有效,而另一种无效。
问题恰如错误所言...
匿名函数或方法组不能用作动态绑定操作的组成值。
这只是意味着您不能使用匿名函数,因为其中一个参数是动态类型,因此要修复您的方法,只需将参数转换为 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);
}
Run Code Online (Sandbox Code Playgroud)
或者大概是通过查看您的代码...来完成的。
return Query<MyDbObject>(sql, id, mapper);
Run Code Online (Sandbox Code Playgroud)
使用Func委托时不会抱怨的原因是,您从未通过使用dynamic类型来调用DLR,所以没有动态绑定的操作。