2

我有很多Accounts,每個帳戶也可以有子帳戶。因此,我知道一個帳戶是否爲root的方式歸功於ParentId屬性中的值。
所以,事實證明,我的代碼有這樣的東西在很多地方:.Where(acc => acc.ParentId == 0)所以我認爲有關創建看起來像這樣的屬性:簡化此屬性以用於謂詞

public bool IsRootAccount 
{ 
    return a.ParentId == 0; 
} 

看來工作,它編譯,但在運行時我得到但以下情況除外:

Load operation failed for query 'GetAccounts'. The specified type member 'IsRootAccount' is not supported in LINQ to Entities. Only initializers, entity members, and entity navigation properties are supported.

有一個簡單的方法可以讓我實現我想要什麼?

我也想過創造一些東西,會返回一個沒有運氣的Expression<Func<Account, bool>>

編輯:我爲IsRootAccount財產嘗試是爲了使用這樣的.Where(acc => acc.IsRootAccount)

+2

「IsRootAccount」的返回類型與返回的值('bool'!= lambda)不匹配。 – 2012-03-09 00:17:51

+0

謝謝,我解決了它...我從一個不同的屬性複製:) – sebagomez 2012-03-09 00:26:14

+0

你也可以告訴我們你試圖建立的查詢消耗這個屬性?我懷疑你可以做到你想要的東西,但我們可能會提出一些替代解決方案。 – 2012-03-09 00:31:49

回答

1

提供此功能的一種非常簡單的方法是使用擴展方法。

嘗試這樣:

public static class AccountEx 
{ 
    public static IQueryable<Account> WhereIsRootAccount(
      this IQueryable<Account> source) 
    { 
     return source.Where(acc => acc.ParentId == 0); 
    } 
} 

然後,您將與.WhereIsRootAccount()取代.Where(acc => acc.ParentId == 0)每次使用。

這種方法的優點是它與EF一起工作,並且它提供了一種查詢您的根帳戶的流利方式。如果您需要修改根帳戶的定義,則您也只有一個地方可以進行更改。並且它不會污染您的Account類,並且不必要的代碼。

我希望這會有所幫助。


基於您的評論,試試這個:

public static class AccountEx 
{ 
    public static EntityQuery<Account> WhereIsRootAccount(
      this EntityQuery<Account> source) 
    { 
     return source.Where(acc => acc.ParentId == 0); 
    } 
} 

由於WhereEntityQuery<>支持,那麼它應該仍然正常工作。

+0

RIA服務的方法,我喜歡這個主意......會試試看 – sebagomez 2012-03-09 12:03:47

+0

它幫助,謝謝...但它不能從使用Silverlight客戶端,對嗎?在客戶端有沒有辦法做到這一點? – sebagomez 2012-03-09 12:12:14

+0

@sebastian - 我對Silverlight並不完全熟悉 - 你能告訴我爲什麼你不認爲Silverlight能起作用嗎? – Enigmativity 2012-03-09 12:25:34

0

這裏的東西,我發現,但我想看看是否有事情好做。
我知道EF不知道如何將我的謂詞轉換爲SQL,因爲我的屬性。 所以我不能做到這一點:

Context.Load(Context.GetAccountsQuery().Where(acc => acc.IsRootAccount), ParentAccountsArrived, null); 

但我可以用我的財產,一旦過濾的結果回來從服務器:

public void LoadParentAccounts() 
{ 
    Context.Load(Context.GetAccountsQuery(), ParentAccountsArrived, null); 
} 
void ParentAccountsArrived(LoadOperation<Account> lo) 
{ 
    foreach (var account in lo.Entities.Where(acc => acc.IsRootAccount)) 
    { 
     ParentAccounts.Add(account.Name); 
    } 
} 

這是要走的路?這種改變是否存在性能問題?

+0

是什麼GetAccountsQuery – Nix 2012-03-09 00:53:51

+0

是它返回一個IQueryable的''一個 – sebagomez 2012-03-09 00:56:19