2011-01-24 42 views
3

我想檢索數據,並設置添加到entityobject(通過部分類)的屬性。通過Linq-to-entities設置擴展屬性

我該怎麼做?

這是我的查詢:

var ret = (from item in contex.Items 
       select new Itemm 
       { 
        Title = item.Title, 
        Count = 1 // more complex: Count =item.refToAnotherEntity.Count()           
       }); 

public partial class Itemm 
{ 
    public int Count { get; set; } 
} 

我得到錯誤:實體或複雜類型不能在LINQ構建以查詢實體

回答

0

的問題是,LINQ到實體正試圖轉換整個表達式爲SQL。您的「新」聲明並不完全可能。

嘗試以下操作:

var ret = (from item in contex.Items 
      select new Itemm 
      ).ToList(); 
ret = (from item in ret 
     select new Itemm 
      { 
       Title = item.Title, 
       Count = 1           
      }).ToList(); 

基本上,你要確保結果被從SQL服務器返回(在ToList()做到這一點),試圖重新構建他們面前。這並不漂亮,你可以將它清理一下,但上面的代碼應該可以工作。

+0

以及如何如果我想設置計數與從查詢中剔除的值?例如擁有此項目的用戶數量? (當存在對另一個實體的引用時) – asker 2011-01-24 19:49:55

+0

嘗試將此問題改寫爲^^毫無意義。 – 2011-01-24 19:53:34

-1

如果你願意的處理移動到客戶端(即從IQueryable<T>IEnumerable<T>移動),那麼你可以做這樣的事情:

var query = (from item in context.Items 
    select new Item {      
     Title = item.Title 
    }); 

var ret = query.AsEnumerable().Select(i => { 
    // Set the count. 
    i.Count = 1; 

    // Return the item. 
    return i; 
}); 

的關鍵是下降到IEnumerable<T>,在那點,LINQ提供者變成了LINQ to Objects,它不會給你這個問題。

0

您的查詢不會轉換爲正確的SQL,因爲linq不會知道如何處理您的額外問題。

有一些方法可以初始化您的自定義屬性。

您可以創建

部分無效OnCreated() {}

這裏編寫自定義的初始化,如果你 要加載後,從數據庫中加載,那麼你可以 覆蓋

保護覆蓋無效OnLoaded(布爾初始) { base.OnLoaded(ini​​tial); }

0

我試圖達到相同的結果,你是。 到目前爲止,我的最佳解決方案是創建一個封裝給我的實體,該實體具有Count屬性以在部分類上設置額外的屬性。 以你的情況爲例,這將是這樣的:

public class ItemWithCount 
{ 
    public Item Item { get; set; } 
    public int Count 
    { 
     get { return Item.Count; } 
     set { Item.Count = value; } 
    } 
} 

然後,你可以讓你的查詢是這樣的:

var ret = (from item in contex.Items 
      select new ItemWithCount 
      { 
       Item = item, 
       Count = item.refToAnotherEntity.Count()           
      }).AsEnumerable().Select(x => x.Item); 

而不是創建包裝的,你可以用相同的2選擇一個匿名類型屬性,但這意味着在查詢之後,您必須通過結果並設置每個實體的屬性Count的值。事情是這樣的:

var ret = (from item in contex.Items 
      select new 
      { 
       Item = item, 
       Count = item.refToAnotherEntity.Count()           
      }); 
Parallel.ForEach(ret, x => x.Item.Count = x.Count); 
var results = ret.Select(x => x.Item); 

我preffer第一個選項,我們雖然我想有一個解決方案,而無需創建一個新的類...任何想法?