嗯,这不是一个普通的重复问题。因为行中某些字段(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,那么我宁愿避免使用它们!
感谢你们的时间= =
答案 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