[c#] linq to SQL을 사용하여 한 번에 여러 행을 업데이트하는 방법은 무엇입니까?

표:

id     userid  friendid   name    status
1      1        2         venkat  false
2      1        3         sai     true
3      1        4         arun    false
4      1        5         arjun   false

사용자가 userid = 1, friendids = 2,4,5 status = true를 보낸 경우

위의 모든 friendids 상태를 업데이트하는 방법에 대한 쿼리를 알려주세요. [한 번에 2,3,4].?

감사



답변

하나의 열을 업데이트하려면 다음과 같은 몇 가지 구문 옵션이 있습니다.

옵션 1

var ls=new int[]{2,3,4};
using (var db=new SomeDatabaseContext())
{
    var some= db.SomeTable.Where(x=>ls.Contains(x.friendid)).ToList();
    some.ForEach(a=>a.status=true);
    db.SubmitChanges();
}

옵션 2

using (var db=new SomeDatabaseContext())
{
     db.SomeTable
       .Where(x=>ls.Contains(x.friendid))
       .ToList()
       .ForEach(a=>a.status=true);

     db.SubmitChanges();
}

옵션 3

using (var db=new SomeDatabaseContext())
{
    foreach (var some in db.SomeTable.Where(x=>ls.Contains(x.friendid)).ToList())
    {
        some.status=true;
    }
    db.SubmitChanges();
}

최신 정보

주석에서 요청한대로 여러 열을 업데이트하는 방법을 보여주는 것이 합리적 일 수 있습니다. 따라서이 연습의 목적을 위해 statusat 1 을 업데이트하는 것이 아니라고 가정 해 보겠습니다 . 우리는 업데이트 할 namestatus를 Where friendid일치입니다. 이에 대한 몇 가지 구문 옵션은 다음과 같습니다.

옵션 1

var ls=new int[]{2,3,4};
var name="Foo";
using (var db=new SomeDatabaseContext())
{
    var some= db.SomeTable.Where(x=>ls.Contains(x.friendid)).ToList();
    some.ForEach(a=>
                    {
                        a.status=true;
                        a.name=name;
                    }
                );
    db.SubmitChanges();
}

옵션 2

using (var db=new SomeDatabaseContext())
{
    db.SomeTable
        .Where(x=>ls.Contains(x.friendid))
        .ToList()
        .ForEach(a=>
                    {
                        a.status=true;
                        a.name=name;
                    }
                );
    db.SubmitChanges();
}

옵션 3

using (var db=new SomeDatabaseContext())
{
    foreach (var some in db.SomeTable.Where(x=>ls.Contains(x.friendid)).ToList())
    {
        some.status=true;
        some.name=name;
    }
    db.SubmitChanges();
}

업데이트 2

대답에서 LINQ to SQL을 사용하고 있었고이 경우 데이터베이스에 커밋하는 방법은 다음과 같습니다.

db.SubmitChanges();

그러나 Entity Framework가 변경 사항을 커밋하려면 다음과 같습니다.

db.SaveChanges()


답변

ToList()수락 된 답변과 같은 방법을 사용 하지 마십시오 !

SQL 프로파일 러를 실행하면서 ToList()함수가 데이터베이스에서 모든 레코드를 가져 오는 것을 확인하고 찾았 습니다. 정말 나쁜 성능입니다 !!

다음과 같이 순수 SQL 명령으로이 쿼리를 실행했을 것입니다.

string query = "Update YourTable Set ... Where ...";
context.Database.ExecuteSqlCommandAsync(query, new SqlParameter("@ColumnY", value1), new SqlParameter("@ColumnZ", value2));

이것은 한 행도 선택하지 않고 원샷으로 업데이트를 수행합니다.


답변

이것이 내가 한 일입니다.

EF :

using (var context = new SomeDBContext())
{
    foreach (var item in model.ShopItems)  // ShopItems is a posted list with values 
    {
        var feature = context.Shop
                             .Where(h => h.ShopID == 123 && h.Type == item.Type).ToList();

        feature.ForEach(a => a.SortOrder = item.SortOrder);
    }

    context.SaveChanges();
}

희망은 누군가를 돕습니다.


답변