绑定到asp.net中的linq继承类型
我有一个Linq-to-SQL数据模型,其中包括一个类型绑定到asp.net中的linq继承类型,asp.net,vb.net,linq,.net-3.5,Asp.net,Vb.net,Linq,.net 3.5,我有一个Linq-to-SQL数据模型,其中包括一个类型Party,该类型为公司和个人的两个子类。我尝试将两个转发器绑定到Linq到SQL查询,如下所示 Dim oComp As IEnumerable(Of Company) Dim oInd As IEnumerable(Of Individual) oComp = From oP As Company In ERM.Parties _ Where TypeOf (oP) I
Party
,该类型为公司
和个人
的两个子类。我尝试将两个转发器绑定到Linq到SQL查询,如下所示
Dim oComp As IEnumerable(Of Company)
Dim oInd As IEnumerable(Of Individual)
oComp = From oP As Company In ERM.Parties _
Where TypeOf (oP) Is Company And _
oP.Name.StartsWith(sSearchString)
oInd = From oP As Individual In ERM.Parties _
Where TypeOf (oP) Is Individual And _
(oP.FirstName.StartsWith(sSearchString) Or _
oP.LastName.StartsWith(sSearchString))
rptIndividuals.DataSource = oInd
rptCompanies.DataSource = oComp
rptCompanies.DataBind()
rptIndividuals.DataBind()
当我按预期单步执行代码oComp
和oInd
时,它们是IEnumerable
和IEnumerable
,但是当到达第一个DataBind
调用时,我得到以下异常
用户代码未处理System.MissingMethodException
Message=“找不到类型为”System.Data.Linq.Provider.DataBindingList1[[DataModel.Party,DataModel,Version=1.0.0.0,Culture=neutral,PublicKeyToken=null]]”的构造函数。”
Source=“mscorlib”
堆栈跟踪:
位于System.RuntimeType.CreateInstanceImpl(BindingFlags bindingAttr、Binder Binder、Object[]args、CultureInfo区域性、Object[]ActivationAttribute)
在System.Activator.CreateInstance(类型类型、BindingFlags bindingAttr、Binder Binder、对象[]参数、CultureInfo区域性、对象[]ActivationAttribute)
位于System.Data.Linq.Provider.BindingList.Create[T](DataContext上下文,IEnumerable
1序列)
在System.Data.Linq.DataQuery1.GetNewBindingList()中
位于System.Data.Linq.DataQuery
1.System.ComponentModel.IListSource.GetList()处
位于System.Web.UI.DataSourceHelper.GetResolvedDataSource(对象数据源,字符串数据成员)
位于System.Web.UI.WebControl.ReadOnlyDataSource.System.Web.UI.IDataSource.GetView(字符串viewName)
在System.Web.UI.WebControl.Repeater.ConnectToDataSourceView()中
在System.Web.UI.WebControls.Repeater.GetData()中
位于System.Web.UI.WebControl.Repeater.CreateControlHierarchy(布尔useDataSource)
位于System.Web.UI.WebControl.Repeater.OnDataBinding(EventArgs e)
在System.Web.UI.WebControls.Repeater.DataBind()中
在parties.lbHiddenPostback\单击\parties.aspx.vb中的(对象发送者,事件参数e):第491行
在System.Web.UI.WebControl.LinkButton.OnClick(EventArgs e)中
位于System.Web.UI.WebControl.LinkButton.RaisePostBackEvent(String eventArgument)
位于System.Web.UI.WebControl.LinkButton.System.Web.UI.IPostBackEventHandler.RaisePostBackEvent(字符串事件参数)
位于System.Web.UI.Page.RaisePostBackEvent(IPostBackEventHandler sourceControl,String eventArgument)
位于System.Web.UI.Page.RaisePostBackEvent(NameValueCollection postData)
在System.Web.UI.Page.ProcessRequestMain(布尔includeStagesBeforeAsyncPoint,布尔includeStagesAfterAsyncPoint)
内部异常:
然后,如果我选择所有的内容作为参与方,则一切正常
Dim oComp As IEnumerable(Of Party)
Dim oInd As IEnumerable(Of Party)
oComp = From oP In ERM.Parties _
Where TypeOf (oP) Is Company And _
CType(oP, Company).Name.StartsWith(sSearchString)
oInd = From oP In ERM.Parties _
Where TypeOf (oP) Is Individual And _
(CType(oP, Individual).FirstName.StartsWith(sSearchString) Or _
CType(oP, Individual).LastName.StartsWith(sSearchString))
rptIndividuals.DataSource = oInd
rptCompanies.DataSource = oComp
rptCompanies.DataBind()
rptIndividuals.DataBind()
两个转发器中都没有与返回的数据相关的内容,只是项模板中的一个标签,用于显示每个查询返回了多少条记录
必须绑定到父类型对我来说没有意义,如果不首先强制转换到该类型,我将无法访问与个人和公司关联的属性 在设置中继器的
数据源
属性时,可以使用.ToArray()
来解决此问题
rptCompanies.DataSource = oComp.ToArray ()
我不相信我知道它为什么会起作用,但我试过了,它似乎解决了问题