2012-03-01 100 views
3

我以前做了很多使用存儲過程進行所有數據修改的開發。試圖獲取第一個項目收集返回NULL

但是我現在需要使用LINQ To SQL,並且一個基本的基本任務讓我難住。

我有一個叫做Book(Title,Author,等等)的類。一些書被實例化並被添加到 public ObservableCollection Books

到目前爲止,我可以看到它的藏品中包含有效的書籍。

我有一個功能DeleteOldestBook()它只是得到書中的第一本書,並刪除。這是我遇到麻煩的地方。

我嘗試和選擇

Book BookToDelete = Books.Take(1) as Book; 

,但它總是返回NULL。

我已經成功哈克解決方法:

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

但是,這是可怕的,我知道有一些簡單的我已經錯過了。

LINQ專家的任何想法?讓我知道你是否需要更多的代碼。

在此先感謝

+1

有沒有'Books.FirstOrDefault()'? – mindandmedia 2012-03-01 21:33:31

+0

首先,使用調試器驗證您可以在Books中看到一本書。其次,在Books.Take(1)上添加一個監視並確保它可以轉換爲一本書,因爲如果投射失敗,「as」投射將返回null。另一種測試演員表的方法是將該行更改爲Book BookToDelete =(Book)Books.Take(1); – 2012-03-01 21:38:30

+0

有幾個很好的答案 - 一定要接受爲你工作的答案。 – Fourth 2012-03-01 21:46:10

回答

6

Take將返回一個集合,在這n個元素。您仍然需要遍歷該集合。在你的情況下,收集大小爲1.

First將返回集合中的第一個項目。

加分

如果您收藏尚未排序使用OrderBy

Book bookToDelete = Books.OrderBy(b => b.SomeDate).First(); 
+2

額外額外的功勞,不要認爲有任何書籍。使用.FirstOrDefault() – Quango 2012-03-02 04:43:55

6

只需使用FirstOrDefault()

var firstBook = Books.FirstOrDefault(); 

如果沒有書的收集,firstBook會是null,否則它會被設置爲第一個我TEM。

通常你想通過的第一本書雖然有些標準,如果因此就使用事先適當Where條款:

var firstThriller = Books.Where(b => b.Type == "Thriller") 
         .FirstOrDefault(); 
+0

答案錯誤的原因是錯誤的:take不返回Book。 – Servy 2012-03-01 21:46:52

+0

我沒有看到我錯誤的原因是什麼 - 事實上我沒有深入瞭解OP的代碼不工作,而是爲了做什麼。我承認這是一種遺漏,但這裏所說的任何內容都沒有錯。 – BrokenGlass 2012-03-01 21:53:09

+0

對不起,我應該說你省略了它。 – Servy 2012-03-01 22:00:51

1

Take返回IEnumerable<T>包含單個元素,你想要的是:

Books.FirstOrDefault(); 

其中返回第一個元素(或null i f Books爲空)。

10

Take()返回IEnumerable<Book>。因此,您嘗試將其轉換爲Book失敗,並返回空值。而不是使用Books.First()Books.FirstOrDefault()

澄清了NitpickersTake()可能實際上是IQuerable<Book>如果Books返回直接從DataContext來了。

3

我只想用

Books.First(); 

而不是

Take(1); 

取擴展方法返回IQueryable<T>和你想投的TBook)。這就是爲什麼你總是得到空。

2

是的,你錯過了First()擴展方法:

Book BookToDelete = Books.First(); 

注意Take(int)返回圖書(IQueryable<T>)的序列 - 即使序列包含在你的情況只是一個項目。由於沒有從IQueryable<T>T的轉換,因此as將返回空值。