带有连接查询的Linq只返回一条记录

时间:2013-12-12 21:41:56

标签: c# asp.net linq

过去几天一直试图解决这个问题,这真让我感到沮丧。我只在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 Class

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;
        }
    }

2 个答案:

答案 0 :(得分:1)

根据对question其他版本的评论,OnRowDatabound处理程序似乎有问题。您的Linq查询返回一个动态对象。在处理程序中,将其强制转换为Subcategory类型的对象。这将失败 - 虽然我无法解释为什么这只会在第一个要显示的记录中结束。可能与吞噬错误的页面级或全局错误处理程序有关。效果似乎是GridView在第一行触发错误后停止绑定 为了解决这个问题,我建议创建一个类,其中包含要从Linq查询返回的属性以及GrifView和OnRowDatabound处理程序中所需的属性。在处理程序中,强制转换为此类型并根据需要使用数据。

答案 1 :(得分:0)

我建议您对数据源执行ToList()。我不确定这是否是您遇到的问题,但有时对于IEnumerable<>,如果在枚举发生之前处理了某些依赖项,则可能会阻止它完全执行。例如,如果this.Entities在页面呈现之前变为无效,则可能会导致问题。所以这样做:

gvSubCategories.DataSource = new BASubCategory().GetSubCatWithCatName().ToList();
gvSubCategories.DataBind();