Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/269.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C#成员表达式函数<;T、 对象>;到函数<;T、 布尔>;MethodBinaryExpression_C#_Lambda_Expression_<img Src="//i.stack.imgur.com/WM7S8.png" Height="16" Width="18" Alt="" Class="sponsor Tag Img">servicestack - Fatal编程技术网 servicestack,C#,Lambda,Expression,servicestack" /> servicestack,C#,Lambda,Expression,servicestack" />

C#成员表达式函数<;T、 对象>;到函数<;T、 布尔>;MethodBinaryExpression

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

是否可以将成员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 == 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);
    }
}