Дублированные поля в моих записях, как и где их обрабатывать? - PullRequest
1 голос
/ 19 декабря 2010

Ну, это не обычный повторяющийся вопрос. Потому что дублирование в определенных полях (UserId и Name) в строке и мне нужно создать только один объект для каждого UserId и все еще собирает другую связанную уникальную информацию в строке.

Это не первый мой вопрос об этой проблеме, см. Мой первый вопрос об этой проблеме

Это структура базы данных, которую я использую

Таблица пользователей

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 для идентификатора и строку для имени, два свойства списка List и List и еще два класса для типов привилегий и медалей

и моя страница asp.net (как слой представления), которая использует ObjectDataSource в качестве источника данных для привязки.

Я использую метод в своем DAL, чтобы объединить все предыдущие таблицы и выбрать UserId, UserName, Privellege, Medal и вернуть список всех пользователей.

Проблема SQL должен будет дублировать идентификатор пользователя и имя более одного раза, каждый раз со значением привилегии, и снова идентификатор и пользователь плюс привилегия с каждым значением медали , и мне нужно просто иметь ОДИН объект для удержания пользователя.

Пример результата для запроса, если я только что выбрал 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 ]

1 голос
/ 19 декабря 2010

Если я правильно понимаю, вы ищете способ моделировать одного пользователя, его медали и привилегии.Чистый способ сделать это - создать класс как модель представления, которая явно моделирует для вас, как показано ниже:

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, такого как Entity Framework.Это будет управлять вашей настойчивостью, поэтому вы можете сосредоточиться на своей бизнес-логике.

0 голосов
/ 19 декабря 2010

Хорошо, давайте начнем с WHERE , чтобы обработать возврат неповторяющихся записей, поскольку это, как правило, простое решение.Вот как вы решаете: если вы можете устранить дубликаты с помощью TSQL в вашей хранимой процедуре без , затрагивающей вашу объектную модель и все бизнес-правила в коде (то есть все может изменяться незаметно), чем делать это на уровне базы данных.Это может быть решено в вашем сценарии с помощью комбинации SELECT DISTINCT и INNER JOINS в исходном запросе.

Если, однако, вы хотите решить эту проблему на уровне базы данных и она исправляет один единственный сценарий в коде, но разбивает другойТо, что делать в хранимой процедуре - не хорошая идея.В этом случае вы можете использовать LINQ to DataSets, вероятно, в DAL при сопоставлении с вашими объектами, чтобы отфильтровать данные для этого конкретного сценария.LINQ to DataSets достаточно мощный (или LINQ to Objects).Вы можете использовать LINQ to DataSets, добавив ссылку на System.Data.DatasetExtensions.

Руководство по программированию (LINQ to DataSet):
http://msdn.microsoft.com/en-us/library/bb387004.aspx

0 голосов
/ 19 декабря 2010

Можете ли вы попробовать этот скрипт, который работает нормально Входной файл UsedId UserName 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, (эхо "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

Выводом будет UseId _ *. Txt, который можно объединить

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

1-я строка будет сравнивать UsedId = 1 означает, что будет создан файл Create.txt

2-й и 3-й распространены

4-я строка будет выполнять 1, Mike, Create, C # 5-й и 6-й являются общими все файлы, которые мы можем объединить

С уважением, Суреш

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...