我正在使用Visual Studio Express 2013和SQL Server Express 2014編寫一個使用LINQ to SQL來訪問數據的WPF應用程序。我的意圖是完整的CRUD功能,使用映射到observableCollections的各種UI元素。到目前爲止,一切正常,但我只是使用映射到datagrid的單個表。我想用兩個表中的左連接的結果呈現單個數據網格,因此在dbml佈局中我創建了一個新表,並使用存儲過程作爲數據源IDE生成的代碼如下所示:WPF LINQ to SQL類定製
[global::System.Data.Linq.Mapping.TableAttribute(Name="dbo.ListAllDocuments")]
public partial class TrackDocument : INotifyPropertyChanging, INotifyPropertyChanged
{ // innards removed for readability }
當我運行這個時,我得到一個未處理的異常「無效的對象名'dbo.ListAllDocuments'」。 。 。這是帶有Left Join語句的存儲過程。我如何着手將查詢語言添加到我構建的用於表示此數據的類中?下面是構造函數中觀察到的類,我與單個表的情況下爲藍本最終結合UI:
class ObservableTrackDocument : ObservableCollection<TrackDocument>
{
public ObservableTrackDocument(DocControlClassesDataContext dataDc)
{
foreach (TrackDocument tDoc in dataDc.TrackDocuments)
{
this.Add(tDoc);
}
}
}
但DataContext的未填充的表,因爲該存儲過程不能用作源。它發生,我認爲我需要在構造在這裏添加LINQ查詢,然後執行foreach循環來填補的ObservableCollection:是這樣的:
class ObservableTrackDocument : ObservableCollection<TrackDocument>
{
public ObservableTrackDocument(DocControlClassesDataContext dataDc)
{
var query = from f in dataDc.FilesTransmitteds
from r in dataDc.FilesReturneds
.Where(x => f.DocumentNumber == x.DocumentNumber && f.REV == x.REV)
.DefaultIfEmpty()
select new { (list of fields) };
foreach (TrackDocument tDoc in query)
{
this.Add(tDoc);
}
}
}
但是,這並不工作,要麼(我remvove「源「引用了原始異常原因的dbml佈局中的TrackDocument類屬性列表的存儲過程)。 。 。出於某種原因,編譯器無法協調將查詢項目轉換爲TrackDocument類。
我是否需要重寫TrackDocument類中IDE生成的方法之一以執行普通單表格情況下會導致TrackDocuemnts集合的查詢?如果是這樣,你能給我一個如何重寫的例子嗎?類代碼在自動生成的文件中,所以我知道我不能在那裏手動添加東西。 。 。
我希望這很清楚。 。 。我很困惑這種語言來描述這些事情。
謝謝,保羅
我想你會想要將存儲過程與使用System.Data.Linq.Mapping.FunctionAttribute的函數相關聯。 – juharr 2014-11-06 18:54:20
@juharr我通過將存儲過程拖放到設計器佈局中來解釋你所說的將存儲過程添加到DataContext中。 。 。我已經完成了。它顯示爲一種方法,可以與類的行爲相關聯,但只能作爲插入,刪除或更新。如果我手動更改designer.cs文件,那麼它將被覆蓋,因爲它是由IDE自動生成的。所以我不確定你的意思。 。 。對不起:) :) – 2014-11-06 19:12:48
@juharr我試圖把行改成'[global :: System.Data.Linq.Mapping.FunctionAttribute(Name =「dbo.ListAllDocuments」)]'但編譯器告訴我這只是適用於方法。 。 。 – 2014-11-06 21:04:09