2009-05-05 160 views
2

我有一個linq查詢,它根據問題文本返回一個問題的ID。 然後需要使用此ID來將日期表中的日期與該特定問題相關聯。問題已存儲,日期存儲在不同的時間。C#Linq Guid匿名類型問題

問題是查詢以匿名類型的形式返回questionID,因此當我需要將另一個表中的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 q.QuestionID; 

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

另外,給該領域的名稱( 「theID」 下方),並且直接訪問它:

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()); 
} 

顯然,還有更多的比我首先想到的問題。迴應評論時,請記住,你正在返回一個枚舉匹配結果(因此上面的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(); 
} 
1

爲什麼不只是select q.QuestionID;,而不是這個'選擇新{q.QuestionID};」東東?

+0

+1擊敗我35秒。 – 2009-05-05 09:21:55

+0

我嘗試過,將代碼更改爲: dlu.QuestionID = matchedques; :收到這樣的: 錯誤:無法隱式轉換類型「System.Linq.IQueryable 」到「的System.Guid」 \t C:\ Documents和 – Goober 2009-05-05 09:26:15

+0

sahgilbert - 見下文 – 2009-05-05 09:28:41

-1

更改爲:

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

eg刪除新的{...},所以你正在用id屬性創建一個新的anonimouse類型。

1

您正在打電話。的ToString()上matchedques,這是一個枚舉:

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運算符以找出原因。簡單地

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

然後:

1

試試這個

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

FirstOrDefaultmatchedques VAR設置爲對象,而不是他們的ennumeration的單個實例。如果你知道只有一個你想要的價值,那麼可以提供一種享受。如果沒有找到,OrDefault位表示它將是NULL