我在。net v4 aspx页面上有一个实体数据源(连接到SQL Server 2012数据库)。我的数据源声明如下所示:
<asp:EntityDataSource ID="BlahBlah" runat="server"
ConnectionString="name=BlahBlah"
DefaultContainerName="BlahBlah" EnableFlattening="False"
EntitySetName="vw_shop_ProductListWithIndivCats"
Where="it.Display =true" OrderBy="it.[DisplayPriority]"
Select="DISTINCT it.[ProductID], it.[Name], it.[Short_rubric], it.[Price], it.[Available], it.[Display], it.[ProductDetailLayoutID], it.[DisplayPriority] " >
当用户与站点交互时,在代码中修改WHERE
值。实体比SELECT
语句中的列多
数据显示在gridview中,除了DISTINCT
关键字不受尊重外,工作得很好,即来自表的重复行正在gridview中显示。
有什么建议吗?
这个问题的更多细节。实体(它是一个视图)vw_shop_ProductListWithIndivCats
中的列是:
ProductID
Name
Short_rubric
Rubric
Price
Postage
Image_small
Image_Large
ImageType
Available
Display
ProductDetailLayoutID
DisplayPriority
CategoryID
Category
大多数字段派生自产品表。在视图中,Categories
表有一个多对多连接,最后两个字段通过通常的链接表进行中介。
在用户界面中,用户可以按类别选择产品,由于产品可能有多个类别,例如n个类别,select语句(不包含distinct)产生x行,由于视图只包含产品表中的字段,因此将包含n个重复行。我期待DISTINCT或GROUP BY删除行,但也没有。通过临时放置一个列表视图来显示每一列
为什么不尝试添加包含所有列的GROUP BY
子句呢?这里是到EntityDataSource主文章的链接
你可能知道,在这种情况下,GROUP BY
和DISTINCT
都可能在SQL Server中产生相同的查询计划。
所以你会把它改成这样(去掉DISTINCT
):
<asp:EntityDataSource ID="BlahBlah" runat="server"
ConnectionString="name=BlahBlah"
DefaultContainerName="BlahBlah" EnableFlattening="False"
EntitySetName="vw_shop_ProductListWithIndivCats"
Where="it.Display =true" OrderBy="it.[DisplayPriority]"
Select="it.[ProductID], it.[Name], it.[Short_rubric], it.[Price], it.[Available], [Display], it.[ProductDetailLayoutID], it.[DisplayPriority]"
GroupBy="it.[ProductID], it.[Name], it.[Short_rubric], it.[Price], it.[Available], it.[Display], it.[ProductDetailLayoutID], it.[DisplayPriority]" />