linq2db .NET ORM部分更新?

时间:2015-06-06 18:12:10

标签: orm linq2db

我们将Linq2DB ORM库用于.NET ORM模型 见https://github.com/linq2db/linq2db

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

3 个答案:

答案 0 :(得分:4)

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

using (var db = new DbNorthwind())
{
   db.Product
    .Where(p => p.ProductID == product.ProductID)
    .Set(p => p.Name, product.Name)
   .Set(p => p.UnitPrice, product.UnitPrice)
  .Update();
}

答案 1 :(得分:0)

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

答案 2 :(得分:0)

我对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);
            }
        }