2011-11-22 2 views
1

많은 행이 포함 된 테이블의 열을 업데이트해야합니다. 각 행에는 그 안에 몇 개의 큰 TEXT 열이 있는데,이 열은 내 업데이트가 필요하지 않습니다.Linq2SQL : 일부 열만 선택했지만 변경 사항을 계속 제출할 수 있습니다.

내가 LinqPAD을 사용하고 있는데, 이것은 내가 뭘하고 싶어 무엇을, 대략입니다 : 익명 클래스 유형의 속성은 읽기 전용으로,

(from s in Table 
where s.FK_ID == null 
select new{s.FK_ID, s.Datum, s.PBNummer}).ToList() 

.ForEach(s => s.FK_ID = new Guid(...some new guid here...)); 

SubmitChanges(); 

이 컴파일되지 않습니다. 매우 긴 시간이 걸리고 메모리 문제가 발생

내가

(from s in Table 
where s.FK_ID == null 
select s).ToList() 

을 할 경우, I 업데이트하고 저장하지만, 모든 열을로드 할 수 있습니다.

일부 열을로드하지만 여전히 SubmitChanges을 사용하여 업데이트하고 저장할 수있는 개체가 있습니까? 아니면 SQL 문으로 전환해야합니까? SQL에 Linq에있는 데이터베이스 레코드의 특정 열을 업데이트 할

+1

추가 한 것을 제외하고 이것은, 쿼리와 유사하다 있으리라 믿고있어 왜 LINQ-2를 통해이 작업을 수행해야 할 SQL? 원시 쿼리를 발행 할 수 없습니까? – alexn

+0

@alexn 'new Guid()'부분은 여기 나의 예제와 같이 더 복잡합니다. – okrumnow

답변

2

데이터베이스에 기본 키가 없으면 Linq-To-Sql을 통해 업데이트 할 수 없습니다. 기본 키를 가지고 있지만, 그냥 어떤 알 수없는 경우, 당신은 (당신이 기본 키를 알게되면, 당신은 다음과 같은 작업을 수행 할 수 있습니다

var table = (from t in Mapping.GetTables() 
       where t.TableName == "[Table]" select t).SingleOrDefault(); 

(from dm in table.RowType.DataMembers 
      where dm.DbType != null && dm.IsPrimaryKey 
      select dm.Name) 
      .Dump("Primary Key"); 

같은 작업을 수행하여 Linqpad에서 찾을 수 있습니다 나는 이드라고 기본 키)

var oldList = (from s in Table 
      where s.FK_ID == null 
      select new{s.Id , s.FK_ID, s.Datum, s.PBNummer}).ToList() ; 

나는 기본 키

foreach(var r in oldList) 
{ 
    Table t = new Table(); 
    t.Id  = r.Id ; 

    Table.Attach(t); 
    t.FK_ID = new Guid(...some new guid here...)); 
} 
SubmitChanges(); 
+0

최종 해결책에 가깝습니다. [링크] (http://devio.wordpress.com/2011/01/16/updating-a-single-column-in-linq-to-sql-using-attach/)에 관해서는 두 번째 새로운 동일한 ID이지만 다른 데이터를 컨텍스트에 적용한 다음 제출하십시오. 그것은 결국 효과가있었습니다. 도움을 주신 모든 분들께 감사드립니다. – okrumnow

+1

ID가 "임의의 값"으로 끝날 것이라고 예상하기 때문에이 링크의 예는 역 직감으로 보입니다.나는 그것이 작동한다는 것을 부인하지는 않지만 왜 그것이 효과가 있는지 설명 할 수는 없다. 그러나, 나는 당신이 먼저 새로운 레코드를 첨부 한 다음 변경을해야한다는 점에서 나의 예제 (나는 지금 고쳐야한다)에서 오류가 있다는 것을 깨닫는다. – sgmoore

+0

반 직관이지만 작동하는 것에 동의합니다. 매개 변수가 마지막에서 처음으로 처리된다고 가정합니다. 편집 한 버전이 더 이해가되며 내일 작동하는지 확인해 드리겠습니다. 감사합니다. – okrumnow

4

방법은 많은 열을 포함하는 테이블에보기를 만드는 것입니다, 만은 "짧은"열 포함 :보기 이후

CREATE VIEW [dbo].[V_FooMax] AS 
SELECT OID, ID 
FROM dbo.FooMax 

싱글을 기반을

using (var database = new DataContext()) 
{ 
    var fooView = database.V_FooMaxes 
    .Where(foo => foo.OID == OID).FirstOrDefault(); 
    fooView.ID = newID; 
    database.SubmitChanges(); 
} 

참고 : 또한 http://devio.wordpress.com/2011/01/15/updating-a-single-column-in-linq-to-sql-using-a-view/

을 수행 할 수 있습니다 리터 테이블을 업데이트 할 수있는 뷰에 대한 업데이트는 테이블에 업데이트로 수행된다 ook at : http://devio.wordpress.com/2011/01/16/updating-a-single-column-in-linq-to-sql-summary/

+0

LinqPad에서 매핑이 자동으로 생성되는 LinqPad에서는 작동하지 않는 것 같습니다. 당신이 언급 한 기사는 말한다하십시오하면 .dbml 파일 _When 매핑보기, 당신이 알아서해야합니다 * 내가 더하면 .dbml 파일이없고 할 수있는 방법을 찾지 못했습니다 기본 키 열 _의 정의 LinqPad의 기본 키 열을 정의하십시오. – okrumnow