我的模型可能是这样的:
public class Person
{
public virtual Guid ID { get; set; }
public virtual string FirstName { get; set; }
public virtual string LastName { get; set; }
//this LazyList takes IQueryable<T> in constructor
public virtual LazyList<Role> Roles { get; set; }
//this method to convert the object that comes from EF to my own model
public static Person FromData(DBPerson dbPerson)
{
if (dbPerson != null)
return new Person
{
ID = dbPerson.ID,
FirstName = dbPerson.FirstName,
LastName = dbPerson.LastName,
};
return null;
}
}
然后在我的存储库中我有方法来获取所有人,但我需要它来从其他私有方法“getRoles”提供LazyList<Role>
属性结果。
我的存储库看起来像这样:
public IQueryable<Person> GetPersons()
{
var list = from dbPerson in context.Persons
select Person.FromData(dbPerson);
// Here is the problem :(
return list;
}
private LazyList<Role> getRoles(GUID userID)
{
var list = from role in db.Roles
where role.UserID == userID
select role.ToModel();
return new LazyList<Role>(list);
}
我想在这里告诉一下Linq声明,我希望Person.Roles从“getRoles”方法中获取其值
也许有人会告诉我把dbPerson的逻辑转换成我在存储库中的Person,然后放这样的东西:
public IQueryable<Person> GetPersons()
{
var list = from dbPerson in context.Persons
select new Person{
ID = dbPerson.ID,
FirstName = dbPerson.FirstName,
LastName = dbPerson.LastName,
Roles = getRoles(dbPerson.ID)};
}
好的,但是我真的需要把dbPerson的逻辑转换成我的模型,因为我会在我的解决方案中多次起诉。
那怎么做?
答案 0 :(得分:2)
进行转换的单独方法怎么样?这样你就可以重复使用它。
public Person ToPerson(dbPerson row, bool getDetails)
{
Person result = new Person{
ID = row.ID,
FirstName = row.FirstName,
LastName = row.LastName};
if(getDetails)
{
result.Roles = getRoles(row.ID)};
}
return result;
}
答案 1 :(得分:2)
我意识到在调用我的特殊方法之前,我无法调用任何外部方法直到我的GetEnumerator。 实体框架引发了这个错误。
所以代码应该是这样的:
public IQueryable<Person> GetPersons()
{
var list = context.Persons.select(p=>p).AsEnumerable()
.Select(m=>m.MyExtensionMethod());
return list;
}