C# 如何在值数目未知的情况下使用select查询
我有两个下拉列表,一个用于项目,第二个用于类别。 我有一个选择ddproject的id,根据这个id我必须填充ddcategory。 桌子结构 这里是一个简单的查询,如果我从下拉列表中选择ProjectOneC# 如何在值数目未知的情况下使用select查询,c#,asp.net,linq,sql-server-2008,C#,Asp.net,Linq,Sql Server 2008,我有两个下拉列表,一个用于项目,第二个用于类别。 我有一个选择ddproject的id,根据这个id我必须填充ddcategory。 桌子结构 这里是一个简单的查询,如果我从下拉列表中选择ProjectOne select id,name from tbcategory where id in(1,2) 但我的问题是我不知道在这种情况下会有多少值 C: 首先,我拆分了列名categoryid,然后得到了值。我不知道该怎么做。 另外,请让我知道我是否以正确的方式或任何其他方式来实现这一目标
select id,name from tbcategory where id in(1,2)
但我的问题是我不知道在这种情况下会有多少值
C:
首先,我拆分了列名categoryid,然后得到了值。我不知道该怎么做。
另外,请让我知道我是否以正确的方式或任何其他方式来实现这一目标
编辑:
或者我是否应该更改我的表结构,如果是,那么应该是什么模式?根据您的数据,类别和项目之间存在多对多的关系。因此,您需要对另一个多:多表进行建模,以保存对这种关系进行建模的数据 首先,创建一个新表来保存类别和项目之间的多:多关系:
create table tbProjectCategory
(
tbProjectId INT,
tbCategoryId INT
);
然后,删除tbProject中的字符串逗号分隔关系-这没有用。相反,将链接插入多个表中。e、 g:
insert into tbProjectCategory(tbProjectId, tbCategoryId) values (1, 1), (1, 2);
将项目1链接到类别1和类别2
然后,要查找项目1的所有类别,您需要通过Many:Many链接表进行联接,并按项目Id进行过滤:
select cat.id, cat.name
from tbcategory cat
inner join tbProjectCategory prjcat
on prjcat.tbCategoryId = cat.id
where prjCat.tbProjectId = 1;
为了简洁起见,我还删除了您的标识列—这样可以更容易地知道链接了哪些数据记录。我将创建M:N关系表,如:
tbProjects2Categories
IDCategory int;
IDProject int;
然后您可以进行查询:
SELECT c.id, c.name FROM tbCategory c JOIN tbProjects2Categories pc
ON c.IDCategory = pc.IDCategory
WHERE pc.IDProject = @selectedProjectId;
项目和类别之间的关系如下所示:
IDProject | IDCategory
这意味着在原始模式中:
(1,'ProjectOne','Mumbai','1,2,3');
(2,'ProjectTwo','USA','1,3');
要完成回答,请执行以下操作:
在逗号分隔的列表中存储实体关系并不是一个好的实践。您甚至需要几天的时间来拆分该列值并使查询工作。是的,逗号分隔的值不是在数据库中存储关系的好方法。您应该再创建一个表来定义两个原始表之间的关系:
create table tbProjectCategory (id int IDENTITY(1,1),projectId int, categoryId int)
然后您可以根据projectId进行查询,如下所示:
select * from tbcategory c
inner join tbProjectCategory pc on c.id = pc.categoryId
where projectId = 1;
请试一试这把小提琴:谢谢你的回复,但你能解释得更清楚吗?我仍然不清楚,先生,但这里一个项目可以有多个类别,所以必须为一个项目插入每个类别记录,这正是多:多表的要点。ProjectOne和ProjectII都使用类别硬件。类别只创建一次,就像项目一样,但是,对于项目和类别之间的每个有效关联,都会向链接表中添加一条记录。@SuartLC:谢谢,我将带上您的注释谢谢您的回复,因此我需要创建一个新表,以便保存两个表ID,每个类别都有可能需要插入冗余数据。如果您不希望[IDProject,IDCategory]的重复组合,请让IDCategory和IDProject成为复合主键。如果允许双重性,请将IDProjects2Cats等标识主键添加到该表->但在这种情况下,您的查询结果中也会有双重性,因此您应该将DISTINCT添加到查询中。感谢您的精彩解释。感谢您的回复,+1用于sql FIDLE演示
select * from tbcategory c
inner join tbProjectCategory pc on c.id = pc.categoryId
where projectId = 1;