尝试获取集合中的第一个项目返回NULL

Joe*_*her 3 c# linq linq-to-sql

我之前使用Stored Procs进行了大量的开发来进行所有数据修改.

但我现在需要使用LINQ To SQL,而基本的基本任务让我感到难过.

我有一个名为Book(Title,Author等)的课程.许多书籍被实例化并添加到公共ObservableCollection书籍中

到目前为止一切顺利,我可以看到它在其藏品中保存了有效的书籍.

我有一个函数DeleteOldestBook(),它只是获取书籍中的第一本书,并删除.这是我遇到麻烦的地方.

我尝试选择

Book BookToDelete = Books.Take(1) as Book;
Run Code Online (Sandbox Code Playgroud)

但它总是返回NULL.

我做了一个hacky解决方法:

var AllBooks = from BookToDelete in Books select BookToDelete;
foreach (Book BookToDelete in AllBooks)
{ 
    //  BookToDelete.dostuff takes place ... 
    break; // only do 1
}
Run Code Online (Sandbox Code Playgroud)

但这太糟糕了,我知道我错过了一些简单的东西.

LINQ专家的任何想法?如果您需要更多代码,请告诉我们.

提前致谢

eou*_*3hf 10

Take()返回一个IEnumerable<Book>.因此,您尝试将其转换为Book失败,返回null值.

使用Books.First()Books.FirstOrDefault()代替.

Nitpickers的澄清:如果直接来自a,Take()实际上可能会返回.IQuerable<Book>BooksDataContext


cad*_*ll0 6

Take将返回一个包含n个元素的集合.您仍然需要迭代该集合.在您的情况下,集合大小为1.

First 将返回集合中的第一个项目.

额外信用

如果您的集合尚未排序使用 OrderBy

Book bookToDelete = Books.OrderBy(b => b.SomeDate).First();
Run Code Online (Sandbox Code Playgroud)

  • 额外的额外信用,不要假设有任何书籍.使用.FirstOrDefault() (2认同)

Bro*_*ass 6

只需使用FirstOrDefault():

var firstBook = Books.FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)

如果集合中没有书籍,firstBook则会null将其设置为第一个项目.

通常情况下,您会希望按照某些标准来阅读第一本书,如果是这样,请Where事先使用适当的条款:

var firstThriller = Books.Where(b => b.Type == "Thriller")
                         .FirstOrDefault();
Run Code Online (Sandbox Code Playgroud)