2010-07-28 63 views
2

我有我的模型東西,也許是這樣的:如何從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); 
     } 

我想這裏的東西來告訴我要Person.Roles從「getRoles」的方法得到它的值這個LINQ的聲明

也許有人會告訴我放在倉庫轉換dbPerson到我一個人的邏輯,然後把這樣的事情:

 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)}; 
     } 

OK,將工作,但我真的需要把轉換dbPerson T的邏輯o我的模型採用單獨的方法,因爲我會在我的解決方案中多次提起訴訟。

那麼該怎麼做?

回答

2

我意識到,我不能調用任何外部方法,直到我調用我的特殊方法之前我GetEnumerator。 這個錯誤是由實體框架提出的。

因此,代碼應該是這樣的:

 public IQueryable<Person> GetPersons() 
     { 
      var list = context.Persons.select(p=>p).AsEnumerable() 
         .Select(m=>m.MyExtensionMethod()); 
      return list; 
     } 
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; 
} 
+0

這有點欺騙,但我需要讓我的轉換方法是靜態的。 另一件事,這將使我在存儲庫中設置此方法,但我想在很多地方使用它。不管怎樣,謝謝你 :) – 2010-08-03 09:15:13

相關問題