MVC - Linq - заполнить список <T>записями в другой таблице - PullRequest
3 голосов
/ 18 сентября 2009

Я создаю прототип моего первого приложения MVC, это простой форум. Я сделал часть модели предметной области, и я пытаюсь понять, как сделать что-то довольно простое только в SQL, но я не могу понять это в своем приложении. Вот мои сущности:

[Table(Name="Users")]
public class User
{
    [Column(IsPrimaryKey=true, IsDbGenerated=true, AutoSync=AutoSync.OnInsert)]
    public int Id { get; set; }

    [Column] public string Username { get; set; }
    [Column] public string Password { get; set; }
    [Column] public string PasswordHash { get; set; }
    [Column] public string PasswordSalt { get; set; }
    [Column] public string FirstName { get; set; }
    [Column] public string LastName { get; set; }
    public List<Forum> AllowedForums { get; set; }
    [Column] public DateTime LastLogin { get; set; }
    [Column] public DateTime MemberSince { get; set; }
}

[Table(Name="Forums")]
public class Forum
{
    [Column(IsPrimaryKey=true, IsDbGenerated=true, AutoSync=AutoSync.OnInsert)]
    public int Id { get; set; }
    [Column] public int ParentId { get; set; }
    [Column] public string Title { get; set; }
    [Column] public string Description { get; set; }
    [Column] public bool IsGlobal { get; set; }
    [Column] public int DisplayOrder { get; set; }
}

У меня также есть таблица ссылок под названием AllowedForums, которая выглядит следующим образом:

userid  forumid
  1       4

Чтобы выбрать форумы, которые пользователь может просматривать, и форумы, где IsGlobal == true, я бы сделал это в SQL:

SELECT * FROM Forums
LEFT OUTER JOIN AllowedForums ON Forums.id = AllowedForums.Forumid
WHERE AllowedForums.Userid = 1
OR Forums.IsGlobal = 1

Как мне заполнить

public List<Forum> AllowedForums

поле с использованием C # / Linq to SQL?

Должен ли AllowedForum быть объектом-значением со своим собственным отображением таблицы? Это кажется излишним, но я мог бы легко присоединиться к нему. Я кратко посмотрел на EntitySet, но простой пример, который я увидел, не подходил. Такое чувство, что должен быть элегантный способ получить коллекцию объектов форума для каждого пользователя, но я не могу придумать ни одного. Кстати, я новичок в C # & OO. Я должен также упомянуть, что, поскольку это ранние стадии приложения, я открыт для изменения структуры / отношений сущностей или таблиц, если есть лучший подход, которого я не вижу.

Ответы [ 2 ]

3 голосов
/ 18 сентября 2009

У вас должен быть другой класс Entity (вероятно, должен быть внутренним), который отражает вашу таблицу AllowedForums в базе данных. Теперь я предполагаю, что ваша таблица пользователей и таблица форумов имеют отношения PK / FK к этой таблице AllowedForums. Следовательно, в классе User должно быть внутреннее свойство, которое выглядит следующим образом:

internal EntitySet<AllowedForums> AllowedForumsRelationships
{
   get;set;
}

Или что-то в этом роде. Это должно быть как в классе пользователя, так и на форуме. Ваш класс AllowedForums будет иметь два свойства. Один для пользователя и один для форума. (Если вы используете конструктор LINQ to SQL, все это произойдет автоматически).

Если у вас есть это, если вы хотите получить все разрешенные форумы для пользователя, вы можете сделать что-то вроде этого:

    public IList<Forum> AllowedForums
    {
       get
       {
          var result = new List<Forum>();
          foreach(var relationShip in this.AllowedForumsRelationships)
          {
             result.Add(relationShip.Forum);
             return result;
          }
       }
    }

Это какой-то грубый код, который я только что опубликовал, и я не уверен, что он на 100% точен, но я думаю, вы поймете эту идею. По сути, вы имеете дело со многими отношениями, которые всегда являются болью.

РЕДАКТИРОВАТЬ: Я только что связался с этой идеей с базой данных Northwind с этими таблицами:

Заказы Информация для заказа Продукты

Здесь существует отношение многих ко многим: заказ может иметь несколько продуктов, а продукт может принадлежать многим заказам. Теперь скажите, что хотите получить все товары для заказа:

public partial class Order
{
        public IList<Product> Products
        {
            get
            {
                var list = new List<Product>();
                foreach (var item in this.Order_Details)
                {
                    list.Add(item.Product);
                }
                return list;
            }
        }
 }

Это работает, поэтому должно работать и в сценарии, о котором вы говорите.

0 голосов
/ 18 сентября 2009

Что-то вроде:

var AllowedForums = from f in ForumsTable
                    join af in AllowedForumsTable on f.Id equals af.forumid into temp
                    from aft in temp.DefaultIfEmpty()
                    where (f.IsGlobal == 1 || aft.userid == 1)
                    select f;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...