linq2db.NET ORM部分更新?

linq2db.NET ORM部分更新?,orm,linq2db,Orm,Linq2db,我们在.NET ORM模型中使用Linq2DB ORM库 看 如何仅发送更改列的更新? 现在,SQL查询包含所有列和值目前没有跟踪对象级别更改的机制来仅更新更改的属性,但是如果您知道更改了哪些列,则可以将set函数与update函数结合使用来执行部分更新(就像github页面中给出的示例) 目前没有跟踪对象级别更改的机制来只更新更改的属性,但是如果您知道更改了哪些列,则可以将set函数与update函数结合使用来执行部分更新(就像github页面中给出的示例) 首先,linq2db是一个轻量级的

我们在.NET ORM模型中使用Linq2DB ORM库 看

如何仅发送更改列的更新?
现在,SQL查询包含所有列和值

目前没有跟踪对象级别更改的机制来仅更新更改的属性,但是如果您知道更改了哪些列,则可以将set函数与update函数结合使用来执行部分更新(就像github页面中给出的示例)


目前没有跟踪对象级别更改的机制来只更新更改的属性,但是如果您知道更改了哪些列,则可以将set函数与update函数结合使用来执行部分更新(就像github页面中给出的示例)


首先,linq2db是一个轻量级的ORM。这意味着它没有繁重的上下文,它对实体中的更改一无所知,如果你想进行更改跟踪,它永远不会使用实体框架或NHibernate。所以你必须自己实现更改跟踪(如果你真的需要的话)或更新整个实体(就像你做的那样)。如果您知道更新的列,则可以使用提供的任何语法(请参阅)。如果您只知道更改的列名,则可以动态构造linq表达式并使用其中一种语法。

首先,linq2db是一种轻量级ORM。这意味着它没有繁重的上下文,它不知道实体中的任何更改,如果您想使用实体框架或NHibernate进行更改跟踪,它永远不会知道。因此,您必须自己实施更改跟踪(如果确实需要)或更新整个实体(就像您所做的那样)。如果您知道更新的列,则可以使用提供的任何语法(请参阅)。如果您只知道更改的列名,则可以动态构造linq表达式并使用其中一种语法。

我对L2DB有类似的要求,最后我编写了下面的代码。它使用包装类(
BaseAuditor
),但希望您能理解。有一天,我可能会将此代码移动到某种基本POCO类中,我的所有L2DB类都继承自该类,但事实上,我不确定性能的提升是否值得。无论如何,值得的是:

        private class Change
        {
            public MemberExpression Extract = null;
            public object Value = null;

        }

        private List<Change> Changes = new List<Change>();

        /// <summary>
        /// Records this change, for application later
        /// </summary>
        /// <typeparam name="TV"></typeparam>
        /// <param name="extract"></param>
        /// <param name="value"></param>
        /// <returns></returns>
        public BaseAuditor<T> Set<TV>(Expression<Func<T, TV>> extract, TV value)
        {
            // Record this change for use later

            var memberExpression = (MemberExpression)extract.Body;
            this.Changes.Add(new Change() {Extract = memberExpression, Value = value});

            return this;
        }

        /// <summary>
        /// Applies our changes to the given entity
        /// </summary>
        /// <param name="entity"></param>
        private void ApplyChanges(T entity)
        {
            foreach (var change in this.Changes) {
                var property = (PropertyInfo)change.Extract.Member;
                property.SetValue(entity, change.Value, null);
            }
        }
私有类更改
{
public MemberExpression Extract=null;
公共对象值=null;
}
私有列表更改=新列表();
/// 
///记录此更改,以便以后应用
/// 
/// 
/// 
/// 
/// 
公共BaseAuditor集(表达式提取,TV值)
{
//记录此更改以供以后使用
var memberExpression=(memberExpression)extract.Body;
this.Changes.Add(newchange(){Extract=memberExpression,Value=Value});
归还这个;
}
/// 
///将我们的更改应用于给定实体
/// 
/// 
私有无效应用更改(T实体)
{
foreach(此.Changes中的var更改){
var property=(PropertyInfo)change.Extract.Member;
property.SetValue(实体,change.Value,null);
}
}

我对L2DB也有类似的要求,最后我在下面编写了这段代码。它使用了一个包装类(
BaseAuditor
),但希望您能理解。有一天,我可能会将此代码移动到某种基本POCO类中,我的所有L2DB类都继承自该类,但事实上,我不确定性能的提升是否值得。无论如何,值得的是:

        private class Change
        {
            public MemberExpression Extract = null;
            public object Value = null;

        }

        private List<Change> Changes = new List<Change>();

        /// <summary>
        /// Records this change, for application later
        /// </summary>
        /// <typeparam name="TV"></typeparam>
        /// <param name="extract"></param>
        /// <param name="value"></param>
        /// <returns></returns>
        public BaseAuditor<T> Set<TV>(Expression<Func<T, TV>> extract, TV value)
        {
            // Record this change for use later

            var memberExpression = (MemberExpression)extract.Body;
            this.Changes.Add(new Change() {Extract = memberExpression, Value = value});

            return this;
        }

        /// <summary>
        /// Applies our changes to the given entity
        /// </summary>
        /// <param name="entity"></param>
        private void ApplyChanges(T entity)
        {
            foreach (var change in this.Changes) {
                var property = (PropertyInfo)change.Extract.Member;
                property.SetValue(entity, change.Value, null);
            }
        }
私有类更改
{
public MemberExpression Extract=null;
公共对象值=null;
}
私有列表更改=新列表();
/// 
///记录此更改,以便以后应用
/// 
/// 
/// 
/// 
/// 
公共BaseAuditor集(表达式提取,TV值)
{
//记录此更改以供以后使用
var memberExpression=(memberExpression)extract.Body;
this.Changes.Add(newchange(){Extract=memberExpression,Value=Value});
归还这个;
}
/// 
///将我们的更改应用于给定实体
/// 
/// 
私有无效应用更改(T实体)
{
foreach(此.Changes中的var更改){
var property=(PropertyInfo)change.Extract.Member;
property.SetValue(实体,change.Value,null);
}
}