在linq中比较guid和guid时出错
本文关键字:guid 出错 比较 linq | 更新日期: 2023-09-27 18:18:21
第一个if条件运行正常,第二个条件失败,出现" cannot cast from guid to string "错误。编译器告诉我这两个id都是guid。那么,为什么在第二个'if'上失败呢?l.P.Id是向导,testP。Id也是一个向导。我不明白为什么会有失败。
if (context.GetSet<PBM>().FirstOrDefault(l=>l.P.Id == testP.Id) != null)
{
context.GetSet<PBM>()
.Remove(context.GetSet<PBM>()
.FirstOrDefault(l => l.P.Id == testP.Id));
context.SaveChanges();
}
if (context.GetSet<MOAH>().FirstOrDefault(l=>l.P.Id == testP.Id) != null)
{
context.GetSet<MOAH>()
.Remove(context.GetSet<MOAH>()
.FirstOrDefault(l => l.P.Id == testP.Id));
context.SaveChanges();
}
按照建议使用.Any(l=>l.P.Id == testP.Id)
之后,现在我所有的单元测试都失败了,除了System.InvalidCastException : Invalid cast from 'System.String' to 'System.Guid'.
错误堆栈跟踪请求:
System.InvalidCastException : Invalid cast from 'System.String' to 'System.Guid'.
at System.Convert.DefaultToType(IConvertible value, Type targetType, IFormatProvider provider)
at System.Convert.ChangeType(Object value, Type conversionType, IFormatProvider provider)
at MySql.Data.Entity.EFMySqlDataReader.ChangeType(Object sourceValue, Type targetType)
at MySql.Data.Entity.EFMySqlDataReader.GetValue(Int32 ordinal)
at System.Data.Entity.Core.Common.Internal.Materialization.Shaper.ErrorHandlingValueReader`1.GetValue(DbDataReader reader, Int32 ordinal)
at System.Data.Entity.Core.Common.Internal.Materialization.Shaper.GetColumnValueWithErrorHandling(Int32 ordinal)
at lambda_method(Closure, Shaper)
at System.Data.Entity.Core.Common.Internal.Materialization.Coordinator`1.ReadNextElement(Shaper shaper)
at System.Data.Entity.Core.Common.Internal.Materialization.Shaper`1.SimpleEnumerator.MoveNext()
at System.Linq.Enumerable.FirstOrDefault(IEnumerable`1 source)
at System.Linq.Queryable.FirstOrDefault(IQueryable`1 source, Expression`1 predicate)
尝试使用Guid.Parse(string guid)
静态方法
使用LinqPad将字符串转换为Guid
var pid=Guid.Parse(testP.Id);
if (context.GetSet<PBM>().Any(l=>l.P.Id == pid) )
{
context.GetSet<PBM>()
.Remove(context.GetSet<PBM>()
.FirstOrDefault(l => l.P.Id == pid));
context.SaveChanges();
}
if (context.GetSet<MOAH>().Any(l=>l.P.Id == pid))
{
context.GetSet<MOAH>()
.Remove(context.GetSet<MOAH>()
.FirstOrDefault(l => l.P.Id == pid));
context.SaveChanges();
}
所以,我检查了数据库,果然,新的迁移脚本更改外表中的列从未运行过…因此,在使其正常运行并将列更新到AsFixedLengthString(36)
之后(我不知道为什么这样做,除了说表可能被内置之外)在实现FM之前通过fluentMigrator以外的其他方式…?)…无论如何,这解决了问题…虽然我不想要任何功劳,因为有没有可能的方式让其他人知道这一点…现在唯一的问题是,怎样处理我的职位才是正确的?我要删除它吗?
旁注(FWIW):从来没有解释为什么一个工作而另一个没有。它们都因为是错误的db类型而受苦…还是不明白。