在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)

在linq中比较guid和guid时出错

尝试使用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类型而受苦…还是不明白。