0

우리는 Linq to SharePoint를 사용하는 프로젝트를 진행하고 있습니다. 목록에는 여러 개의 열이있었습니다. SPMetal을 사용하여 클래스를 만들었 으면 VS로 가져와 데이터 컨텍스트에 액세스했습니다. Linq 쿼리가 정상적으로 작동했습니다.Linq가 열을 콘텐츠 형식으로 변환 한 후 깨졌습니다.

우리는 목록 열을 삭제하고 사이트 열과 함께 콘텐츠 형식을 사용하여 다른 방향으로갔습니다. OOTB, 추가/편집 양식이 잘 작동합니다. 그러나 SPMetal로 클래스를 업데이트하고 데이터 컨텍스트에 대해 클래스를 VS로 가져 오면 모든 Linq 쿼리가 오류로 표시됩니다. Visual Studio는 업데이트 된 클래스의 데이터 컨텍스트에 나타나지 않기 때문에 더 이상 열을 인식 할 수 없습니다. 열은 이제 목록 대신 콘텐츠 형식에 있습니다.

SPMetal을 사용하여 클래스 파일에서 내보낼 콘텐츠 형식의 열을 가져 오는 방법이 있습니까? 콘텐츠 유형이있는 목록으로 Linq에 SharePoint 쿼리를 작성하기 위해 가져올 다른 라이브러리가 있습니까? 콘텐츠 형식 열을 사용하는 Linq 쿼리는 어떻게 작성합니까?

답변

0

문서라고하는 목록이 있다고 가정 해보십시오. 그것은 'One'과 'Two'라는 두 개의 열을 가지고 있습니다. 당신은 당신의 Linq가 SP 쿼리를 잘 만들도록합니다 :

DataContext dc = new DataContext("http://sharepoint"); 
var varResults = (from item in dc.Documents 
        where item.Two == "blah" 
        orderby item.One descending 
        select item); 

그런 다음 사이트 열과 함께 컨텐츠 유형을 사용하기로 결정했습니다. 목록에서 'One'및 'Two'열을 삭제하면 위 쿼리가 중단됩니다. 사이트 열을 만들어 'Master'라는 콘텐츠 유형에 할당합니다. 부모는 항목입니다. Master는 'CloneA'및 'CloneB'라는 두 가지 콘텐츠 유형을 가지고 있습니다. 복제 콘텐츠 유형의 부모가 마스터이기 때문에 자동으로 사이트 열을 가져옵니다.

Column - Content types 
Title - Documents, Master, CloneA, CloneB 
One - Master, CloneA, CloneB 
Two - Master, CloneA, CloneB 

클론 콘텐츠 형식 나중에 문서 목록 유지를위한 다른 정보 정책에 사용됩니다 : 당신이 목록에 콘텐츠 형식을 할당 할 때, 정의는 것 같습니다. 상속을 해제하고 콘텐츠 형식에 대한 보존 정책을 설정 한 후에 항목을 개별적으로 유지 (1 일 - CloneA, 1 주 - CloneB)가 시작될 콘텐츠 형식으로 개별적으로 설정할 수 있습니다.

그러나 linq 대 SP 쿼리는 여전히 손상되었습니다. 사이트 열이 나타나더라도 SPMetal은 어떤 이유로 Base 콘텐츠 유형 만 캡처합니다. 그래서 linq, 컬럼 실제로 위의 쿼리와 함께하지 않습니다. "where item."을 입력하십시오. 'Two'는 나타나지 않습니다. 그것을 제대로 작동 시키려면 캐스팅해야합니다 (아마도 제대로 설명하지 못했을 것입니다). 그래서 여기에 작업 코드는 다음과 같습니다

DataContext dc = new DataContext("http://sharepoint"); 
var varResults = (from item in dc.Documents.OfType<Master>() 
        where item.Two == "blah" 
        orderby item.One descending 
        select item); 

당신은 불행하게도

var varResults = (from item in dc.Documents.OfType<DocumentsMaster>() 

사용하도록 유혹 할 수있다, 단지 목록에서 해당 콘텐츠 형식과 관련된 항목을 반환 것이다. 따라서 특정 콘텐츠 형식의 항목을 필터링하려는 경우 자신을 노크하십시오.

관련 문제