如何为此对象分配linq结果?

时间:2011-07-14 19:57:06

标签: c# linq entity-framework linq-to-sql asp.net-mvc-3

您好我想写一个看起来像这样的模型:

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 个答案:

答案 0 :(得分:1)

您可以创建工厂方法:

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 :(得分:1)

如果您确实要将所有属性从一个对象复制到另一个对象,则可以执行以下操作:

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

在您的情况下,obj1是个人资料对象,obj2this

这只复制公共属性,当然,不会检查以确保obj2的类型声明obj1类型中找到的所有属性。它也不会检查两种类型中的同名属性本身是否属于同一类型。但它应该让你开始。

除非是非常特殊的情况,否则我不建议这样做。

答案 2 :(得分:0)

你不能为此设置任何东西(自我)。您只能在对象中设置字段的属性,而不能设置实例。

使您的方法保持静态并从方法

返回配置文件对象
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
    }

或写入方法来复制所有属性。您可以使用反射将配置文件的属性复制到此,而不提及字段名称。