복붙노트

[SQL] 선택하지 않고 직접 업데이 트를 생성하기 위해 LINQ를 사용하여

SQL

선택하지 않고 직접 업데이 트를 생성하기 위해 LINQ를 사용하여

G'day 모두.

나는 아직도이 순진 경우 LINQ 그래서 용서 배우고 있습니다. 직접 SQL을 처리 할 때, 당신은 select 문을 실행하지 않고, 조건문으로 업데이트 명령을 생성 할 수 있습니다.

내가 LINQ와 함께 작업 할 때 나는의 패턴을 따르는 것 같습니다 :

내가하고 싶은 LINQ 및 지연된 실행을 사용하여 직접 업데이트입니다. 그것은 어떤 데이터가 클라이언트까지 전달되지 않고 실제 실행은 SQL에서 직접 발생하는 것이 가능합니까?

DataContext dc = new DataContext

var q = from product in dc.Products
        where product.Type = 1
        set product.Count = 0

dc.SubmitChanges

그래서 에센스 LINQ에는이 업데이트 명령을 생성하기 위해 선택 사용하지 않고 필요로하는 모든 정보를 제공합니다. 그것은 SQL을 실행합니다 :

Update Products Set Count = 0 Where Type = 1

LINQ에서 "설정"존재와 같은 키워드를합니까?

해결법

  1. ==============================

    1.SQL을 아니, 아니 LINQ도 LINQ는 설정 기반의 업데이트 기능을 가지고있다.

    SQL을 아니, 아니 LINQ도 LINQ는 설정 기반의 업데이트 기능을 가지고있다.

    SQL에 LINQ에서, 당신은, 당신은 업데이트 할 개체를 쿼리 필요에 따라 필드 / 속성을 업데이트해야합니다, 다음 SubmitChanges ()를 호출한다. 예를 들면 :

    var qry = from product in dc.Products where Product.Name=='Foobar' select product;
    var item = qry.Single();
    item.Count = 0;
    dc.SubmitChanges();
    

    당신은 일괄 처리를 수행하고자하는 경우 :

    var qry = from product in dc.Products where Product.Type==1 select product;
    foreach(var item in qry)
    {
      item.Count = 0;
    }
    dc.SubmitChanges();
    

    양자 택일로, 당신은 쿼리를 직접 작성 수 :

    dc.ExecuteCommand("update Product set Count=0 where Type=1", null);
    
  2. ==============================

    2.당신은 실제로 SQL은 LINQ - 투 - 업데이트 문을 생성하도록 할 수 있습니다 :

    당신은 실제로 SQL은 LINQ - 투 - 업데이트 문을 생성하도록 할 수 있습니다 :

    Foo foo=new Foo { FooId=fooId }; // create obj and set keys
    context.Foos.Attach(foo);
    foo.Name="test";
    context.SubmitChanges();
    

    당신의 DBML에서 모든 속성 UpdateCheck = "결코"로 설정하십시오.

    이것은 선택 첫째을 할 필요없이 하나의 UPDATE 문을 생성합니다.

    한 가지주의 : 당신은 당신이 Linq에 변경 사항을 감지 할 수 있도록 다른 값에 foo는 개체를 초기화해야합니다 null로 이름을 설정할 수 있도록하려면 :

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

    업데이트하는 동안 당신은 타임 스탬프를 확인하려면 당신은뿐만 아니라이 작업을 수행 할 수 있습니다

    Foo foo=new Foo { FooId=fooId, Modified=... }; 
    // Modified needs to be set to UpdateCheck="Always" in the dbml
    
  3. ==============================

    3.PLINQO (http://plinqo.com) 프레임 워크는 업데이트를 수행하기 위해 LINQ 일괄 업데이트를 사용하고 있습니다

    PLINQO (http://plinqo.com) 프레임 워크는 업데이트를 수행하기 위해 LINQ 일괄 업데이트를 사용하고 있습니다

    context.Task.Update (t => t.Id == 1, T2 => 새로운 태스크 StatusId {} = 2);

    이것은 업데이트 태스크 세트 StatusId = 2 식 1을 수행합니다

  4. ==============================

    4.LINQ 2 SQL은 SQL을 직접 삽입 / 업데이트 / 삭제 등가물이 없습니다. V1에서 단지 당신이 SQL로 폴백 경우 상황에 SubmmitChanges 생각되거나 LINQ를 사용하여 할 수있는 업데이트합니다.

    LINQ 2 SQL은 SQL을 직접 삽입 / 업데이트 / 삭제 등가물이 없습니다. V1에서 단지 당신이 SQL로 폴백 경우 상황에 SubmmitChanges 생각되거나 LINQ를 사용하여 할 수있는 업데이트합니다.

    그러나 어떤 사람들은 정의 구현을 사용하여 LINQ의 이러한 한계를 극복하기 위해 노력했다.

    LINQ 배치 업데이트.

  5. ==============================

    5.이 확장 방법을 사용 EntityExtensionMethods.cs를

    이 확장 방법을 사용 EntityExtensionMethods.cs를

    public static void UpdateOnSubmit<TEntity>(this Table<TEntity> 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 방법에 전달해야 엔티티 객체 모두 업데이트 할 레코드에 설정된 기본 키 속성이있다합니다. 이 방법은 먼저 레코드 당기는없이 엔티티 객체의 나머지 속성을 가진 레코드를 업데이트 할 것이다.

    UpdateOnSubmit를 호출 한 후에 적용하는 변화에 대한 호출 SubmitChanges ()에 있는지 확인하십시오.

  6. ==============================

    6.당신은 엔티티 프레임 워크 확장 라이브러리를 사용할 수 있습니다, 그것은 도서관은 무료로하지 않습니다하지만, 일괄 업데이트 및 배치 병합을 지원합니다 :

    당신은 엔티티 프레임 워크 확장 라이브러리를 사용할 수 있습니다, 그것은 도서관은 무료로하지 않습니다하지만, 일괄 업데이트 및 배치 병합을 지원합니다 :

    using Z.EntityFramework.Plus;
    
    ...
    
    dc.Products
        .Where(q => q.Type == 1)
        .Update(q => new Product { Count = 0 });
    
  7. ==============================

    7.이 시도 :

    이 시도 :

    dbEntities.tblSearchItems
         .Where(t => t.SearchItemId == SearchItemId)
         .ToList()
         .ForEach(t => t.isNew = false);
    dbEntities.SaveChanges();
    
  8. from https://stackoverflow.com/questions/445033/use-linq-to-generate-direct-update-without-select by cc-by-sa and MIT license