문제

질문 텍스트를 기반으로 질문의 ID를 반환하는 LINQ 쿼리가 있습니다. 그런 다음이 ID는 날짜 테이블의 날짜를 해당 특정 질문과 관련시키기 위해 사용해야합니다. 질문은 이미 저장되고 날짜는 다른 시간에 저장됩니다.

문제는 쿼리가 QuestionID를 익명 유형으로 반환한다는 것입니다. 따라서 다른 테이블에서 QuestionID를 QuestionID를 할당해야 할 때 테이블이 GUID를 기대하고 있음을 명시하면서 오류가 발생합니다. 이어서, 익명 유형을 문자열로 변환 한 다음 Guids 변환 기능을 사용하여 문자열을 Guid로 변환했지만 이제 Guid가 32 자 및 4 개의 대시 여야한다는 오류를 제공합니다.

이것에 대한 나의 생각은 익명 유형이 QuestionId를 "QuestionID = JKJ939-89239829- 등"으로 반환한다는 것입니다. - 전면에 문자의 접두사가 있으므로 안내서로 변환 할 때 변환 된 문자열에는이 문자가 포함됩니다.

내가 뭔가를 놓쳤습니까? 왜 그렇게할지 이해할 수 없으며 익명 유형으로 반환 된 접두사를 제거하는 방법이 있습니까? 도움을 주셔서 감사합니다.

코드는 다음과 같습니다.

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;
        }
    }
도움이 되었습니까?

해결책

내가 뭔가를 놓치지 않는 한, 당신은 왜 그냥하지 않습니까? 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());
}

분명히, 내가 처음 생각했던 것보다 더 많은 질문이있었습니다. 의견에 응답하여 열거 결과의 결과는 Matchedques (따라서 위의 foreach, 맞습니까?). 따라서 다음 줄도 오류가 발생합니다.

string qidGuidString = matchedques.ToString();

당신은 원한다

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

MatchedQues가 단일 결과를 포함하거나 MatchedQues에 여러 결과가 포함되어야하는 경우 Foreach 루프가 포함되어야합니다.


안내서를 문자열로 다시 변환 할 이유가 없으며 쿼리를 사용하여 더 유용한 것을 반환 할 수도 있습니다. 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();
}

다른 팁

그냥하지 그래 select q.QuestionID; 이 대신``select new {q.questionid}; '' 물건?

당신은 matchedques에서 .tostring ()을 호출하고 있습니다. 이는 열거입니다.

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

string qidGuidString = matchedques.ToString();

따라서 위의 예에서 Matchedques는 익명 유형을 사용하는 것입니다 (아마도 그것을 없애고 q.questionid를 직접 선택해야 할 것입니다). 이를 통해 toString ()을 호출하면 객체의 문자열 표현이 반환되며 단순히 시퀀스의 첫 번째 요소의 질문이 아닙니다.

위의 쿼리에 대해 항상 하나의 결과 만있을 것으로 기대하고 있습니까? 그렇다면 단일 연산자를보아야 할 것입니다.

이와 같은 일은 다음과 같습니다.

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

이 경우 MatchedQuesId를 직접 사용할 수 있습니다. Where Query가 일치하지 않거나 둘 이상의 요소가 일치하면 오류가 발생합니다. 그 이유를 알아 보려면 단일 연산자를 읽으십시오.

이 시도:

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 설정합니다 matchedques 객체의 단일 인스턴스에 대한 var. 원하는 가치가 하나만 있다는 것을 알면 치료를합니다. 그만큼 OrDefault 비트는 그것이 될 것임을 의미합니다 NULL 아무것도 발견되지 않았다면.

로 변경:

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

예를 들어 새 {...}를 제거하므로 ID 속성으로 새 Anonimouse 유형을 생성합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top