如何将linq结果赋值给这个对象?
本文关键字:对象 赋值 linq 结果 | 更新日期: 2023-09-27 18:02:02
嗨,我想写一个模型,看起来像这样:
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();
}
}
是否有任何方法来分配每个属性的值给这个?
如果你真的想把所有的属性从一个对象复制到另一个对象,你可以这样做:
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的类型中找到的所有属性。它也不会检查两个类型中的同名属性本身是否具有相同的类型。但它应该让你开始。
我不建议这样做,除非在非常特殊的情况下。
可以创建一个工厂方法:
public static Profile ReadProfile()
{
var query = from u in db.Users.Where(r => r.user_id == user_id )
select u;
return query.First();
}
从不同的角度来看,这是更可取的方法。首先,这不是一个普通的结构。Profile类的用户不能期望在普通的默认构造函数调用期间进行任何与数据库相关的操作,使用工厂方法更清楚地表示您的意图。其次,它简化了进一步的更改。例如,实现数据访问层(又名DAL)的更可取的方法是创建全新的类(或类集)来封装所有与数据库相关的操作。
例如,您可以创建单独的接口:interface IProfileRepository
{
Profile ReadProfile();
}
然后创建具体的存储库:
class ProfileRepository : IProfileRepository
{
public Profile ReadProfile() { .. implementation skipped .. }
}
在这种情况下,你的逻辑更加分离。这允许你简单地用返回"假"对象的"假"类"替换"你真正的类(比如ProfileRepository)。
这种技术被称为"mock",它对于创建不使用任何外部资源(如数据库)的单元测试特别有用。
你不能为this(self)设置任何内容。您只能在对象中设置字段的属性,而不能在实例中设置。
将方法设置为静态,并从方法
返回配置文件对象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
}
或write方法复制所有属性。您可以使用反射将配置文件的属性复制到此,而不需要提及字段名。