繁体   English   中英

Linq与联接查询仅返回一条记录

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM