Как я могу назначить результат linq этому объекту? - PullRequest
0 голосов
/ 14 июля 2011

Привет, я хочу написать модель, которая будет выглядеть следующим образом:

public class Profile : Models.Users {

    ModdDBEntities db = new ModdDBEntities();

    public Profile( int user_id ) {
        this = (Profile)( 
                    from u in db.Users.Where(r => r.user_id == user_id ) 
                    select u 
        ).First();
    }
}

Есть ли какой-нибудь метод для присвоения значений каждому свойству этому?

Ответы [ 3 ]

1 голос
/ 15 июля 2011

Вы можете создать фабричный метод:

public static Profile ReadProfile()
{
   var query = from u in db.Users.Where(r => r.user_id == user_id ) 
               select u;
   return query.First();
}

Это гораздо более предпочтительный путь с разных точек зрения. Прежде всего, это не обычная конструкция. Пользователи вашего класса Profile не могли ожидать каких-либо операций, связанных с базой данных, во время обычного вызова конструкторов по умолчанию, и использование фабричного метода является более понятным способом представления вашего намерения. Во-вторых, это упрощает дальнейшие изменения. Например, еще более предпочтительным способом реализации уровня доступа к данным (a.k.a. DAL) является создание нового класса (или набора классов), который бы инкапсулировал все операции, связанные с базой данных.

Например, вы можете создать отдельный интерфейс:

interface IProfileRepository
{
  Profile ReadProfile();
}

А затем создайте свой конкретный репозиторий:

class ProfileRepository : IProfileRepository
{
  public Profile ReadProfile() { .. implementation skipped .. }
}

В этом случае вы разделяете свою логику еще больше. И это позволяет вам просто «заменить» ваши реальные классы (например, ProfileRepository) на «поддельные» классы, которые возвращают «поддельные» объекты.

Этот метод называется " mocking " и особенно полезен для создания модульных тестов, в которых не используются никакие внешние ресурсы, такие как базы данных.

1 голос
/ 15 июля 2011

Если вы действительно хотите скопировать все свойства из одного объекта в другой, вы можете сделать это:

foreach (var obj1Property in obj1.GetType().GetProperties())
{
    var obj2Property = obj2.GetType().GetProperty(obj1Property.Name);
    obj2Property.SetValue(obj2, obj1Property.GetValue(obj1, null), null);
}

Где в вашем случае obj1 - это объект профиля, а obj2 - this.

Это только копирует публичные свойства и, конечно, не проверяет, чтобы тип obj2 объявлял все свойства, найденные в типе obj1. Он также не проверяет, что свойства с одинаковыми именами в обоих типах имеют одинаковый тип. Но это должно помочь вам начать.

Не то, чтобы я рекомендовал это делать, за исключением очень необычных случаев.

0 голосов
/ 15 июля 2011

Вы ничего не можете установить для этого (себя).Вы можете установить свойства полей только внутри объекта, но не в экземпляре.

Сделайте ваш метод статичным и верните объект профиля из метода

public static Profile GetProfile( int user_id ) {
       var prof = (Profile)( 
                    from u in db.Users.Where(r => r.user_id == user_id ) 
                    select u 
        ).First();
return prof
    }

или напишите метод, чтобы скопировать всесвойства.Вы можете использовать отражение, чтобы скопировать в него свойства профиля, не упоминая имя поля.

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