代码之家  ›  专栏  ›  技术社区  ›  JasonRShaver

linq to ef中的“first”操作出现意外异常

  •  1
  • JasonRShaver  · 技术社区  · 16 年前

    我正在尝试获取数据库中具有给定“userguid”的第一个项,但“first”扩展方法引发以下异常: System.InvalidOperationException: Sequence contains no elements

    以下是一些什么有效,什么无效的例子:

    // Works
    var FoundUser1 = MyEntities.Users.First();
    
    // Works
    var FoundUser3 = MyEntities.Users.ToList().First(r => r.UserGuid == SampleUserGuid);
    
    // Throws System.InvalidOperationException: Sequence contains no elements.
    var FoundUser2 = MyEntities.Users.First(r => r.UserGuid == SampleUserGuid);
    

    有人有什么想法吗?

    编辑

    更奇怪的代码示例:

    // UserList1 is empty
    var Query1 = from x in MyEntities.Users
                 where x.UserGuid == criteria.Value
                 select x;
    var UserList1 = Query1.ToList();
    
    
    // UserList2 has 3 users, including one with a 
    // matching guid value.
    var Query2 = from x in MyEntities.Users
                 select x;
    var UserList2 = Query2.ToList();  
    var Query22 = from x in Query2
                  where x.UserGuid == criteria.Value
                  select x;
    var UserList22 = Query22.ToList();
    
    // Works
    User FoundUser = null;
    foreach (var ThisUser in MyEntities.Users)
    {
       if (ThisUser.UserGuid == criteria.Value)
          FoundUser = ThisUser;
    }
    
    4 回复  |  直到 16 年前
        1
  •  4
  •   Robert Harvey    16 年前

    异常是什么,是“空集”异常还是类似的异常?

    尝试

    FirstOrDefault()
    

    而不是

    First()
    

    看看会发生什么。如果没有可用的记录,First()将引发异常。如果没有可用的记录,firstOrDefault()将为您提供一个空的用户对象。

        2
  •  0
  •   Robert Harvey    16 年前

    在这段代码中:

    // UserList1 is empty
    var Query1 = from x in mgr.ObjectContext.Users
                 where x.UserGuid == criteria.Value
                 select x;
    var UserList1 = Query1.ToList();
    

    criteria.value的值是什么?如果调试并打印它?

        3
  •  0
  •   Robert Harvey    16 年前

    尝试比较它们的字符串值,如

    x.UserGuid.ToString() == criteria.Value.ToString()
    

    在互联网上,还有其他一些人无法直接比较guid的例子。这里有一个: http://bytes.com/groups/net-vb/364009-comparing-guids

        4
  •  0
  •   JasonRShaver    16 年前

    结果发现问题出在sqlite处理guid类型上。如果你设置

    BinaryGuids=True
    

    然后它们被保存为16字节的二进制文件,不能与基于字符串的guid“匹配”。您也可以将其设置为假,它们作为字符串匹配,但您需要注意alpha字符的情况。