43


9

皆さん、こんにちは。

私はまだLINQを学んでいるので、これが素朴であるなら私を許してください。 SQLを直接扱う場合は、select文を実行せずに、条件付きの更新コマンドを生成できます。

私がlinqを使って作業するとき、私は次のパターンに従うようです。

  1. エンティティを選択

  2. エンティティを変更する

  3. 変更を送信

私がやりたいことは、linqを使った直接更新と遅延実行です。 実際の実行は、データがクライアントに送信されずに直接SQLで発生する可能性はありますか?

DataContext dc = new DataContext

var q = dc.Productsのproductから。product.Type = 1に設定するとproduct.Count = 0に設定されます。

dc.SubmitChanges

したがって、本質的にLINQには、selectコマンドを使用して更新コマンドを生成することなく必要なすべての情報があります。 それはSQLを実行するでしょう:

製品の更新セット数= 0ここで、タイプ= 1

LINQには "set"のようなキーワードがありますか?

7 Answer


45


実際にLINQ-to-SQLに更新ステートメントを生成させることができます。

Foo foo = new Foo {FooId = fooId}; // objを作成し、キーを設定します。context.Foos.Attach(foo); foo.Name = "test"; context.SubmitChanges();

あなたのDbmlでは、すべてのプロパティに対してUpdateCheck = "Never"を設定してください。

*これは最初にselectをする必要なしに*単一のupdateステートメントを生成します。

注意点:Nameをnullに設定できるようにしたい場合は、Linqが変更を検出できるようにfooオブジェクトを別の値に初期化する必要があります。

Foo foo = new Foo {FooId = fooId、Name = "###"};
...
foo.Name = null。

更新中にタイムスタンプを確認したい場合は、これも実行できます。

Foo foo =新しいFoo {FooId = fooId、変更しました= ... ;
// Modified needs to be set to UpdateCheck="Always" in the dbml


29


いいえ、LINQもLINQ to SQLもセットベースの更新機能を持っていません。

LINQ to SQLでは、更新したいオブジェクトをクエリし、必要に応じてフィールド/プロパティを更新してからSubmitChanges()を呼び出す必要があります。 例えば:

var qry = dc.Productsの製品からProduct.Name == 'Foobar'で製品を選択します。 var item = qry.Single(); item.Count = 0; dc.SubmitChanges();

あなたがバッチ処理をしたい場合:

var qry = dc.ProductsのproductからProduct.Type == 1を選択します。 foreach(qry内のvar item){item.Count = 0; dc.SubmitChanges();

あるいは、クエリを自分で書くこともできます。

dc.ExecuteCommand( "プロダクトセット数の更新= 0、タイプ= 1"、null);


3


Linq 2 SQLには、SQLに直接対応する直接の挿入、更新、削除はありません。 V1では、linqを使用して行うことができる唯一の更新は、コンテキストに対してSubmmitChangesを使用するか、SQLにフォールバックした場合のみです。

しかし、カスタム実装を使用して、このlinqの制限を克服しようとする人もいます。

https://terryaney.wordpress.com/2008/04/14/batch-updates-and-deletes-with-linq-to-sql/[Linqバッチ更新。]


3


PLINQO(http://plinqo.com)フレームワークはLINQバッチアップデートを使用してアップデートを実行しています

context.Task.Update(t ⇒ t.Id == 1、t2 ⇒新しいタスク{StatusId = 2});

これは `Update Task Set StatusId = 2 Where Id = 1`を実行します。


0


この拡張方法を使用してください:https://gist.github.com/omidkrad/0d97ed153fb4d0cfe5d8a00cb5f29444[EntityExtensionMethods.cs]

public static void UpdateOnSubmit(this Table table, TEntity entity, TEntity original = null)
    where TEntity : class, new()
{
    if (original == null)
    {
        // Create original object with only primary keys set
        original = new TEntity();
        var entityType = typeof(TEntity);
        var dataMembers = table.Context.Mapping.GetMetaType(entityType).DataMembers;
        foreach (var member in dataMembers.Where(m => m.IsPrimaryKey))
        {
            var propValue = entityType.GetProperty(member.Name).GetValue(entity, null);
            entityType.InvokeMember(member.Name, BindingFlags.SetProperty, Type.DefaultBinder,
                original, new[] { propValue });
        }
    }

    // This will update all columns that are not set in 'original' object. For
    // this to work, entity has to have UpdateCheck=Never for all properties except
    // for primary keys. This will update the record without querying it first.
    table.Attach(entity, original);
}

それを使うためには、UpdateOnSubmitメソッドに渡したentityオブジェクトが更新したいレコードに設定されたすべての主キープロパティを持っていることを確認してください。 このメソッドはレコードを先に引っ張らずに `entity`オブジェクトの残りのプロパティでレコードを更新します。

UpdateOnSubmit`を呼び出した後、必ず変更を適用するために SubmitChanges() `を呼び出してください。


0


あなたはhttp://entityframework-extensions.net/bulk-update[*Entity Framework Extensions *]ライブラリを使うことができます、それはバッチ更新とバッチマージをサポートします、しかしライブラリは無料ではありません:

_ PM>インストールパッケージZ.EntityFramework.Extensions _

using Z.EntityFramework.Plus;

...

dc.Products
    .Where(q => q.Type == 1)
    .Update(q => new Product { Count = 0 });


-2


これを試して :

dbEntities.tblSearchItems .Where(t => t.SearchItemId == SearchItemId).ToList().ForEach(t => t.isNew = false); dbEntities.SaveChanges();