我的记录中的重复字段,如何以及在何处处理它们?

时间:2010-12-19 11:03:40

标签: c# asp.net ado.net webforms

嗯,这不是一个普通的重复问题。因为行中某些字段(UserId和Name)的重复和我需要为每个UserId只创建一个对象 并仍然在行中收集其他相关的唯一信息。

这不是我关于同一问题的第一个问题,请参阅My First Question About This Issue

这是我使用的数据库结构

用户表

UsedId    UserName
--------  ----------
1         Mike
2         Raul
3         Nick 

HasPrivileges表

UsedId       PrivilegeId      
--------     --------------
1            1
1            2
1            3
2            2
2            3

特权表

PrivilegeId      Privilege
-------------    ------------
1                Create
2                Edit
3                Delete

HasMedals表

UsedId       MedalsId      
--------     --------------
1            1
1            2
2            2
3            1

奖牌表

MedalsId         Medal
-------------    ------------
1                C#
2                VB.NET

现在我有一个查询我的数据库的DAL

和一个BLL,它有两个属性int用于id和字符串的名称和两个列表属性List和List以及另外两个用于特权和奖牌类型的类

和我的asp.net页面(作为我的表示层)使用ObjectDataSource作为绑定的数据源。

我在DAL中使用一个方法加入所有上一个表,然后选择UserId,UserName,Privellege,Medal并返回所有用户的List。

问题是 sql需要多次复制用户ID和名称,每次都使用权限的值,并且id和user再次加上每个奖牌的权限值。我需要只有一个对象来容纳用户。

如果我刚刚选择UserId = 1

,则查询的结果示例
1   Mike   Create   C#
1   Mike   Edit     C#
1   Mike   Delete   C#
1   Mike   Create   VB.NET
1   Mike   Edit     VB.NET
1   Mike   Delete   VB.NET

任何想法如何处理这种情况的最佳方式(架构和性能明智) 以及在哪里处理它 - 我的意思是在哪一层 - 。

P.S:如果我有其他选项而不是DataSet,那么我宁愿避免使用它们!

感谢你们的时间= =

3 个答案:

答案 0 :(得分:1)

如果我理解正确,您正在寻找一种方法来模拟一个用户,他们的奖牌和特权。一个干净的方法是创建一个类作为视图模型,为您明确地为您建模,如下所示:

public class User
{
    public int ID { get; set; }
    public string Name { get; set; }
    public string[] Medals { get; set; }
    public string[] Privileges { get; set; }
}

一旦有了这个,而不是进行连接,使用IN语句选择所需数据会更自然。这比连接更可取,因为它明确定义了您要查找的内容并避免返回重复数据,并且很容易迭代结果以填充业务对象的字段。以下是如何为UserID = 1执行此操作,如示例所示:

对于用户名信息:

SELECT UserName 
FROM Users 
WHERE UserID = 1;

奖牌信息:

SELECT Medal 
FROM Medals 
WHERE MedalID IN
    (SELECT MedalID
     FROM HasMedals
     WHERE UserID = 1);

对于特权:

SELECT Privilege 
FROM Privileges 
WHERE PrivilegeID IN
    (SELECT PrivilegeID
     FROM HasPrivileges
     WHERE UserID = 1);

另一种方法是使用ORM解决方案,例如实体框架。这将管理您的持久性,因此您可以专注于您的业务逻辑。

答案 1 :(得分:0)

请你试试这个工作正常的脚本 输入文件 UsedId用户名 1迈克 2劳尔 3尼克

nawk -F“”'BEGIN {FS =“”; OFS =“,”} {if($ 1 == 1)print $ 1,$ 2}'输入文件> Create.txt

nawk -F“”'BEGIN {FS =“”; OFS =“,”} {if($ 1 == 1)print $ 1,$ 2}'输入文件> Edit.txt

nawk -F“”'BEGIN {FS =“”; OFS =“,”} {if($ 1 == 1)print $ 1,$ 2}'输入文件> Delete.txt

cat Create.txt nawk -F“,”'BEGIN {FS =“,”; OFS =“,”} {if($ 1 == 1)print $ 1,$ 2,(echo“Create”:“C#” “)}'> UsedId_1.txt

cat Edit.txt nawk -F“,”'BEGIN {FS =“,”; OFS =“,”} {if($ 1 == 2)print $ 1,$ 2,(echo“Edit”:“VB。 NET“”)}'> UsedId_2.txt

cat Delete.txt nawk -F“,”'BEGIN {FS =“,”; OFS =“,”} {if($ 1 == 3)print $ 1,$ 2,(echo“Delete”:“Java” “)}'> UsedId_3.txt

输出将是可以简化的UsedId _ * .txt

!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! !!!!!!!!!!!!!!!

第1行将比较UsedId是1表示将生成Create.txt文件

第2和第3是常见的

第4行将比较执行1,Mike,Create,C# 第5和第6是常见的 我们可以合并的所有文件

此致 苏雷什

答案 2 :(得分:0)

让我们从 WHERE 开始处理非重复记录,因为这通常是一个简单的决定。以下是您的决定:如果您可以在存储过程中使用TSQL消除重复项,而不会影响您的对象模型和代码中的所有业务规则(意味着一切都可以无缝更改),而不是在数据库级别。这可以在您的场景中通过原始查询中的SELECT DISTINCT和INNER JOINS的组合来解决。

但是,如果您想在数据库级别解决此问题,并且它在代码中修复了1个单一场景但又打破了另一个场景,那么在存储过程中进行操作是一个好主意。在这种情况下,当映射到对象以过滤该特定场景的数据时,您可以在DAL中使用LINQ to DataSet。 LINQ to DataSets非常强大(或LINQ to Objects)。您可以通过添加对System.Data.DatasetExtensions的引用来使用LINQ to DataSet。

编程指南(LINQ to DataSet):
http://msdn.microsoft.com/en-us/library/bb387004.aspx