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)
除非我遗漏了一些东西,否则为什么不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)
| 归档时间: |
|
| 查看次数: |
10371 次 |
| 最近记录: |