C# Linq Guid 匿名类型问题

Goo*_*ber 2 c# linq guid anonymous-types linq-to-sql

我有一个 linq 查询,它根据问题文本返回问题的 ID。然后需要使用该 ID 将日期表中的日期与该特定问题相关联。问题已存储,并且日期存储在不同的时间。

问题是查询以匿名类型返回 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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

lc.*_*lc. 5

除非我遗漏了一些东西,否则为什么不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());
}
Run Code Online (Sandbox Code Playgroud)

或者,为字段命名(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());
}
Run Code Online (Sandbox Code Playgroud)

显然,这个问题比我最初想象的要多。作为对评论的回应,请记住,您正在匹配的队列中返回结果的枚举(因此是上面的 foreach,对吧?)。所以下面这行也是错误的:

string qidGuidString = matchedques.ToString();
Run Code Online (Sandbox Code Playgroud)

你要么想要

string qidGuidString = matchedques.Single().ToString();
Run Code Online (Sandbox Code Playgroud)

如果matchedques 应包含单个结果,或者如果matchedques 应包含多个结果,则使用foreach 循环。


请注意,没有理由将 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();
}
Run Code Online (Sandbox Code Playgroud)