如何在LINQ表达式中调用方法?

时间:2010-07-28 17:04:16

标签: c# .net linq

我的模型可能是这样的:

    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的逻辑转换成我的模型,因为我会在我的解决方案中多次起诉。

那怎么做?

2 个答案:

答案 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;
        }