2011-03-17 86 views
2

我有我的課GreenGroup,它從摘要Group繼承。 GreenGroup有一個在部分類中定義的未映射屬性State查詢未映射的類成員

我有一個方法GetGreenGroups(GroupFilter filter)應該返回一個GreenGroup對象列表,其中State == filter.State。

public List<GreenGroup> GetGreenGroups(GroupFilter filter) 
{ 
    IQueryable<VirtualMachineInfo> result = GetAllGroupsInternal(userContext); 

    if(filter.OwnerId != Guid.Empty) 
    { 
     result = result.Where(g => g.OwnerID == filter.OwnerId); 
    } 

    // this is the unmapped property 
    if(filter.State.IsNotNullOrEmpty()) 
    { 
     result = result.Where(g => g.State == filter.State); 
    } 

    // This will throw Class Member Unmapped exception 
    return new List<GreenGroup>(result); 
} 

然而,由於State是不是在數據庫中的字段,這是否意味着我不能將其包含在我的LINQ查詢,但必須在查詢返回之後,進一步篩選我的名單?

我看過幾個網站,包括這個one,其中用戶收到相同的異常Class Member unmapped,但該字段在他們的數據庫,所以它看起來不像一個明確的演員將幫助我。

是我唯一的選擇,像這樣分離過濾?

public List<GreenGroup> GetGreenGroups(GroupFilter filter) 
{ 
    IQueryable<VirtualMachineInfo> result = GetAllGroupsInternal(userContext); 

    if(filter.OwnerId != Guid.Empty) 
    { 
     result = result.Where(g => g.OwnerID == filter.OwnerId); 
    } 

    var groups = new List<GreenGroup>(result); 

    if(filter.State.IsNotNullOrEmpty()) 
    { 
     groups = (from g in groups where g.State == filter.State select g).ToList(); 
    } 

    return groups; 
} 

回答

2

您可以在select子句中使用來自分部類的未映射字段,但不能在where子句中使用。在select子句的情況下,LINQ to SQL將水化整個對象,然後根據需要執行選擇投影。在其他子句(where/order by/etc)的情況下,LINQ to SQL引擎要求列存在於數據庫中以執行適當的操作。如果您必須在where子句中使用unmapped屬性,則必須在使用unmapped屬性之前將查詢從IQueryable強制爲IEnumerable。不幸的是,這要求超集在客戶端進行水合,其餘查詢操作在客戶端執行,這可能是性能瓶頸。在你的例子中,最後的If子句將如下所示:

IEnumerable<GreenGroup> groups; 
if(filter.State.IsNotNullOrEmpty()) 
    groups = (from g in groups.ToEnumerable() where g.State == filter.State select g);  
+0

謝謝,我會研究一下。我在WCF服務中使用它,所以這仍然比沒有好 – earthling 2011-03-22 21:00:28