[英]Linq with join query returning only one record
过去几天一直在尝试解决此问题,这确实让我感到沮丧。 我只在GridView
显示一条记录。
以下是我正在使用的LINQ代码:
public IQueryable GetSubCatWithCatName()
{
return
(from sc in this.Entities.SubCategory
join c in this.Entities.Category
on sc.CategoryID equals c.ID
select new
{
sc.ID,
CategoryName = c.Name,
SubCategoryName = sc.Name,
SubCategoryImage = sc.ImageURL
});
}
我在GridView
组件中显示结果,但是只显示第一条记录
我尝试了上述代码的其他一些版本,但均无济于事。
有人可以帮忙吗?
下面是我的GridView
的定义方式,如果有帮助的话。
<asp:GridView ID="gvSubCategories" runat="server" DataKeyNames="ID" AutoGenerateColumns="false"
onrowdatabound="gvSubCategories_RowDataBound"
onselectedindexchanged="gvSubCategories_SelectedIndexChanged">
<Columns>
<asp:CommandField ShowSelectButton="true" />
<asp:TemplateField>
<ItemTemplate>
<asp:Image ID="imgSubCategory" runat="server" Width="100px" Height="100px" />
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="CategoryName" HeaderText="Category Name" />
<asp:BoundField DataField="SubCategoryName" HeaderText="Sub Category Name" />
<asp:BoundField DataField="SubCategoryImage" HeaderText="Sub Category Image" />
</Columns>
</asp:GridView>
在.cs类中
gvSubCategories.DataSource = new BASubCategory().GetSubCatWithCatName();
gvSubCategories.DataBind();
在BASubCategories中
public IQueryable GetSubCatWithCatName()
{
return new DASubCategory(this.Entities).GetSubCatWithCatName();
}
在DASubCategories中
public IQueryable GetSubCatWithCatName()
{
return
(from sc in this.Entities.SubCategory
join c in this.Entities.Category
on sc.CategoryID equals c.ID
select new
{
sc.ID,
CategoryName = c.Name,
SubCategoryName = sc.Name,
SubCategoryImage = sc.ImageURL
});
}
在RowDataBound中
protected void gvSubCategories_RowDataBound(object sender, GridViewRowEventArgs e)
{
if (e.Row.RowType == DataControlRowType.DataRow)
{
SubCategory currentSubCat = (SubCategory)e.Row.DataItem;
//Image img = (Image)e.Row.FindControl("imgSubCategory");
//img.ImageUrl = currentSubCat.ImageURL;
}
}
根据对您问题的其他版本的评论,OnRowDatabound处理程序似乎有问题。 您的Linq查询返回一个动态对象。 在处理程序中,将其强制转换为Subcategory类型的对象。 这将失败-尽管我无法解释为什么这仅在要显示的第一条记录中结束。 可能与吞没错误的页面级或全局错误处理程序有关。 效果似乎是GridView在第一行触发错误后停止绑定。
为了解决这个问题,我建议创建一个类,其中包含要从Linq查询返回的属性,以及在GrifView和OnRowDatabound处理程序中需要的属性。 在处理程序中,强制转换为此类型并根据需要使用数据。
我建议您在数据源上执行ToList()
。 我不确定这是否是您遇到的问题,但是对于IEnumerable<>
有时,如果某些依赖项在枚举发生之前已被释放,则可能会阻止它完全执行。 例如,如果this.Entities
在页面呈现之前变得无效,则可能导致问题。 这样做:
gvSubCategories.DataSource = new BASubCategory().GetSubCatWithCatName().ToList();
gvSubCategories.DataBind();
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.