我正在使用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