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
Take将返回一个包含n个元素的集合.您仍然需要迭代该集合.在您的情况下,集合大小为1.
First 将返回集合中的第一个项目.
额外信用
如果您的集合尚未排序使用 OrderBy
Book bookToDelete = Books.OrderBy(b => b.SomeDate).First();
Run Code Online (Sandbox Code Playgroud)
只需使用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)