我正在尝试制作各种通用功能,在我的代码的某个地方我有这些行
myDataContext dc = new myDataContext();
.
.
.(some code later)
.
Sucursal sucursal = dc.Sucursal.SingleOrDefault(s => s.Id == id);
效果很好。现在,当我尝试制作“通用”表单时,问题就来了
public static void FindWithId<DataBaseTable>(Table<DataBaseTable> table, int id)
where DataBaseTable : class
{
DataBaseTable t = table.SingleOrDefault(s => s.GetType().GetMember("Id").ToString() == id.ToString());
}
执行此行时
FindWithId<Sucursal>(dc.Sucursal,01);
我收到以下错误
方法 'System.Reflection.MemberInfo[] GetMember(System.String)' 不允许转换 SQL。
大致翻译为:
方法 'System.Reflection.MemberInfo [] GetMember (System.String)' 不支持转换为 SQL。
我能做些什么来完成这项工作?
谢谢!
更新解决方案
我一直在努力寻找解决方案,直到我遇到这个线程,它给出了一个非常彻底的答案,但为了我的目的,我将其调整为:
public class DBAccess
{
public virtual DataBaseTable GetById<DataBaseTable>(int id, Table<DataBaseTable> table) where DataBaseTable : class
{
var itemParameter = Expression.Parameter(typeof(DataBaseTable), "item");
var whereExpression = Expression.Lambda<Func<DataBaseTable, bool>>
(
Expression.Equal(
Expression.Property(
itemParameter,
"Id"
),
Expression.Constant(id)
),
new[] { itemParameter }
);
return table.Where(whereExpression).Single();
}
}
希望它对某人有用:P