LINQ to EF中的“First”操作出现意外异常

时间:2009-07-04 04:51:42

标签: linq linq-to-entities

我试图获取数据库中具有给定'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 个答案:

答案 0 :(得分:4)

什么是例外,它是“空集”异常还是类似的东西?

尝试

FirstOrDefault()

而不是

First()

看看会发生什么。如果没有可用的记录,First()将抛出异常。如果没有可用的记录,FirstOrDefault()将为您提供空的User对象。

答案 1 :(得分:0)

在这段代码中:

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

criteria.Value的值是什么,如果你Debug.Print呢?

答案 2 :(得分:0)

尝试比较其字符串值,如

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

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

答案 3 :(得分:0)

事实证明问题在于SQLite处理GUID类型。如果你设置

BinaryGuids=True

然后它们被保存为16字节的二进制文件,并且不能与基于字符串的guid“匹配”。您也可以将其设置为false并将它们匹配为字符串,但您需要查看alpha字符的大小写。