2009-05-05 5 views
2

질문 텍스트를 기반으로 질문 ID를 반환하는 linq 쿼리가 있습니다. 이 ID는 날짜 표의 날짜를 특정 질문과 연관시키는 데 사용해야합니다. 질문은 이미 저장되어 있으며 날짜는 다른 시간에 저장됩니다.C# Linq Guid 익명 형식 문제

문제는 쿼리 ID가 익명 형식으로 반환되므로 해당 questionID를 다른 테이블의 questionID로 할당해야 할 때 테이블에 Guid가 필요하다는 것을 나타내는 오류가 발생합니다. 이 후 익명 형식을 문자열로 변환 한 다음 GUID로 변환하여 GUID로 변환했지만 GUID는 32 자 및 4 개의 대시가되어야한다는 오류를 표시합니다.

내 생각에 익명 형식이 questionID를 "QuestionID = jkj939-89239829- 등"으로 반환하고 있습니다. - 앞에 접두어가 붙어 있으므로 GUID로 변환 할 때 변환 된 문자열에 이러한 문자가 포함됩니다.

내가 놓친 것이 있습니까? 왜 이렇게 될지 이해할 수 없으며 익명 형식에서 반환 된 접두사를 제거 할 수있는 방법이 있습니까? 도움을 주시면 대단히 감사하겠습니다. 여기

코드입니다 :

public static void GetQuesID(string quesText) 
    { 
     ExamineDataContext dc = new ExamineDataContext(); 
     var matchedques = from q in dc.GetTable<Question>() 
          where q.QuestionText.Contains(quesText) 
          select new{ 
           q.QuestionID 
          }; 
     foreach (var element in matchedques) 
     { 
      MessageBox.Show(element.ToString()); 
     } 

     try 
     { 
      Guid g = Guid.NewGuid(); 
      Table<DateLastUsed> dlused = Repository.GetDateLastUsedTable(); 
      DateLastUsed dlu = new DateLastUsed(); ; 
      string qidGuidString = matchedques.ToString(); 
      Guid convQuesGuid = new Guid(qidGuidString); 
      dlu.DLUID = g; 
      dlu.QuestionID = convQuesGuid; 
      dlu.DateLastUsed1 = DateTime.Now; 

      dlused.InsertOnSubmit(dlu); 
      dlused.Context.SubmitChanges(); 
     } 
     catch (Exception ex) 
     { 
      throw ex; 
     } 
    } 

답변

4

내가 뭔가를 놓치지 않는다면 새로운 익명 유형 래퍼를 만드는 대신 select q.QuestionID을 사용하지 않으시겠습니까?


var matchedques = from q in dc.GetTable<Question>() 
          where q.QuestionText.Contains(quesText) 
          select new{ 
           theID = q.QuestionID 
          }; 

foreach (var element in matchedques) 
{ 
    MessageBox.Show(element.theID.ToString()); 
} 
은 분명히, 내가 처음 생각했던 것보다 질문에 더 있었다 :

var matchedques = from q in dc.GetTable<Question>() 
          where q.QuestionText.Contains(quesText) 
          select q.QuestionID; 

foreach (var element in matchedques) 
{ 
    MessageBox.Show(element.ToString()); 
} 

또는 직접 ("theID"아래) 액세스를 필드 이름을 지정합니다. 코멘트에 대한 응답으로, 의 결과 열거이 matchesques (따라서 위의 foreach는 맞습니까?)라고 반환한다는 것을 명심하십시오. 그래서 다음 줄은 오류도 :

string qidGuidString = matchedques.ToString(); 

당신 하나가

string qidGuidString = matchedques.Single().ToString(); 

을 원하는 matchedques은 하나의 결과를 포함해야하는 경우, 또는 foreach 루프가 matchedques 복수의 결과를 포함해야합니다.

이 문자열에 다시 다시 GUID를 변환 할 이유가 없다, 당신은 또한 더 유용한 뭔가 (즉, 새로운 DateLastUsed 객체)를 호출하는 쿼리를 사용할 수있는

참고 :

var matchedques = from q in dc.GetTable<Question>() 
          where q.QuestionText.Contains(quesText) 
          select new DateLastUsed() { 
           DLUID = Guid.NewGuid(), 
           QuestionID = q.QuestionID, 
           DateLastUsed1 = DateTime.Now 
          }; 

Table<DateLastUsed> dlused = Repository.GetDateLastUsedTable(); 

foreach(var dlu in matchedques) 
{ 
    dlused.InsertOnSubmit(dlu); 
    dlused.Context.SubmitChanges(); 
} 
+0

아래에있는 내 대답은 내가 시도를 참조 그에게 코드를 변경 : dlu.QuestionID = matchedques; 암시 적으로 'System.Guid'\t C로 유형 'System.Linq.IQueryable 을'변환 할 수 없습니다 : \ 문서 및 – Goober

+0

나는이 문제를 해결하는 답을 편집 오류 : 이를 받았다. –

+0

안녕하세요, 위에 게시 한 코드 샘플을 구현했습니다. 이전에는 코드가 오류없이 실행되었지만 실제로는 새로운 세부 정보를 삽입하지 않습니다. – Goober

1

단지 대신의 select q.QuestionID;`새로운 {q.QuestionID}을 선택하지 않은 이유는; ' 물건?

+0

+1 나를 35 초나 이겼다. –

+0

코드를 변경하려고 시도했습니다. dlu.QuestionID = matchedques; 오류 : 이를 받았다 암시 적 유형 'System.Linq.IQueryable ' 'System.Guid'\t C로 변환 할 수 없습니다 : \ Documents 및 – Goober

+0

sahgilbert을 - –

-1

을 변경 :

... 
var matchedques = from q in dc.GetTable<Question>() 
         where q.QuestionText.Contains(quesText) 
         select q.QuestionID; 

예 : new {...}를 제거하면 id 속성을 사용하여 새로운 anonimouse 유형을 만듭니다.

+0

투표를 취소하려면 다음을 지정하십시오. 이유. 이 답변에 어떤 문제가 있습니까? – Kamarey

1

전화하고 있습니다.열거입니다 matchedques에 ToString() : 위의 예에 따라서

var matchedques = from q in dc.GetTable<Question>() 
          where q.QuestionText.Contains(quesText) 
          select new{ 
           q.QuestionID 
          }; 

string qidGuidString = matchedques.ToString(); 

는 matchedques는 익명 형식의 enunmeration (당신은 아마 멀리 그와 함께 할 직접 q.QuestionID를 선택해야합니다)입니다. ToString()을 호출하면 시퀀스의 첫 번째 요소의 QuestionId가 아니라 객체의 문자열 표현이 반환됩니다.

위 쿼리에 대해 항상 하나의 결과 만있을 것으로 예상됩니까? 그렇다면 Single 연산자를 살펴 봐야합니다. 이 같은

뭔가해야한다 :이 경우

var matchedQuesId = 
    dc.GetTable<Question>() 
    .Where(q =>q.QuestionText.Contains(quesText)) 
    .Single() 
    .QuestionID; 

, 당신은 직접 matchedQuesId를 사용할 수 있습니다. Where 쿼리가 none 또는 하나 이상의 요소와 일치하면 오류가 발생합니다. 이유를 찾으려면 Single 연산자를 읽으십시오.

1

이 시도 :

var matchedques = (from q in dc.GetTable<Question>() 
        where q.QuestionText.Contains(quesText) 
        select new{ 
         q.QuestionID 
        }).FirstOrDefault(); 

를 그리고 단순히 :

if (matchedques != null){ 
    // Just use matchedques.QuestionID to get your value 
} 

FirstOrDefault 객체가 아닌 이들의 ennumeration의 단일 인스턴스에 matchedques VAR을 설정합니다. 원하는 가치가 하나 뿐이라는 것을 알 때 치료를하십시오. OrDefault 비트는 아무 것도 발견되지 않으면 NULL이 될 것임을 의미합니다.