Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/258.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在值数目未知的情况下使用select查询_C#_Asp.net_Linq_Sql Server 2008 - Fatal编程技术网

C# 如何在值数目未知的情况下使用select查询

C# 如何在值数目未知的情况下使用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,然后得到了值。我不知道该怎么做。 另外,请让我知道我是否以正确的方式或任何其他方式来实现这一目标

我有两个下拉列表,一个用于项目,第二个用于类别。 我有一个选择ddproject的id,根据这个id我必须填充ddcategory。 桌子结构

这里是一个简单的查询,如果我从下拉列表中选择ProjectOne

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;