C#成员表达式函数<;T、 对象>;到函数<;T、 布尔>;MethodBinaryExpression
是否可以将成员ePxPression与对象一起转换为c#中的方法二进制表达式 到目前为止,我所尝试的:C#成员表达式函数<;T、 对象>;到函数<;T、 布尔>;MethodBinaryExpression,c#,lambda,expression,servicestack,C#,Lambda,Expression,servicestack,是否可以将成员ePxPression与对象一起转换为c#中的方法二进制表达式 到目前为止,我所尝试的: public static void SaveBy<T>(this IDbConnection db, T obj, Expression<Func<T, object>> exp) where T : new() { var com = exp.Compile(); if (db.Update(obj, e => exp == co
public static void SaveBy<T>(this IDbConnection db, T obj, Expression<Func<T, object>> exp) where T : new()
{
var com = exp.Compile();
if (db.Update(obj, e => exp == com.Invoke(obj)) <= 0)
{
db.Insert(obj);
}
}
public static void UpdateBy<T>(this IDbConnection db, T obj, Expression<Func<T, bool>> exp) where T : new()
{
db.Update(obj, exp);
}
它将调用x.Update,将MemberExpression转换为methodBinaryExpression,如下所示:
x.Update(object, model=>model.property == object.property);
中途解决方案
public static void SaveBy(此IDbConnection db,T obj,Expression exp),其中T:new()
{
var result=exp.Compile().Invoke(obj);
var exp2=Expression.Lambda(Expression.Equal(exp.Body,Expression.Constant(result)),exp.Parameters);
如果(db.Update(obj,exp2)您可以只创建新的表达式
model=>model.property == object.property
public static void SaveBy<T, TProp>(this IDbConnection db, T obj, Expression<Func<T, TProp>> exp) where T : new()
{
var memberExp = (MemberExpression)exp.Body;
var objPropExp = Expression.PropertyOrField(Expression.Constant(obj), memberExp.Member.Name);
var equalExp = Expression.Equal(exp.Body, objPropExp);
var exp2 = Expression.Lambda<Func<T, bool>>(equalExp, exp.Parameters);
//exp2 = {model => (model.prop == value(object).prop)}
if (db.Update(obj, exp2) <= 0)
{
db.Insert(obj);
}
}
model=>model.property==object.property
公共静态void SaveBy(此IDbConnection db,T obj,Expression exp),其中T:new()
{
var memberExp=(MemberExpression)exp.Body;
var objPropExp=Expression.PropertyOrField(Expression.Constant(obj),memberExp.Member.Name);
var equalExp=Expression.Equal(exp.Body,objPropExp);
var exp2=Expression.Lambda(equalxp,exp.Parameters);
//exp2={model=>(model.prop==value(object.prop)}
if(数据库更新(obj,exp2)你想从SaveBy调用Update吗?你说的“转换”是什么意思?是的,我想在SaveBy方法中调用Update为什么你使用TProp generic,它似乎在任何地方都没有使用?它比使用对象好吗?TProp
用在exp
参数中,在你的例子中,它将是object
@joelharkes,比如Rob,TProp使用了instead对象,所以您可以获得真正的MemberExpression,而不是表达式转换为object
public static void SaveBy<T>(this IDbConnection db, T obj, Expression<Func<T, object>> exp) where T : new()
{
var result = exp.Compile().Invoke(obj);
var exp2 = Expression.Lambda<Func<T, bool>>(Expression.Equal(exp.Body, Expression.Constant(result)), exp.Parameters);
if (db.Update(obj, exp2) <= 0)
{
db.Insert(obj);
}
}
model=>model.property == object.property
public static void SaveBy<T, TProp>(this IDbConnection db, T obj, Expression<Func<T, TProp>> exp) where T : new()
{
var memberExp = (MemberExpression)exp.Body;
var objPropExp = Expression.PropertyOrField(Expression.Constant(obj), memberExp.Member.Name);
var equalExp = Expression.Equal(exp.Body, objPropExp);
var exp2 = Expression.Lambda<Func<T, bool>>(equalExp, exp.Parameters);
//exp2 = {model => (model.prop == value(object).prop)}
if (db.Update(obj, exp2) <= 0)
{
db.Insert(obj);
}
}