2011-08-19 33 views
3

我使用LinqKit.dll做Linq到實體在我的應用程序的對象,如下:無法投型「System.Linq.Expressions.FieldExpression」

qry = _articleRepo.GetItemsByCulture(Thread.CurrentThread.CurrentCulture.Name) 
           .AsExpandable().Where(x => x.Approved && isInCategory(x.CategoryID, category.CategoryID)); 

Func<string, int, bool> isInCategory = (x, y) => 
      { 
       IQueryable<string> list = x.Split(',').AsQueryable(); 

       //Except 
       //x.Except(_); 

       return list.Any(z => z == y.ToString()); 
      }; 

它給我的錯誤:

System.InvalidCastException:無法投射類型爲 'System.Linq.Expressions.FieldExpression'的對象以鍵入 'System.Linq.Expressions.LambdaExpression'。

但刪除isInCategory(x.CategoryID,category.CategoryID)會導致應用程序運行時沒有問題。

請幫我嗎?

+0

簡短回答:沒有辦法使這項工作。因爲你的方法不能被轉換成SQL。通常的做法是使用SQL函數並將其映射到應用程序,但只有在您使用EDMX進行映射時纔可能。 –

+0

它看起來很奇怪,但買了使用工作單元模式,我的應用程序現在正常工作。 –

+1

我無法確定這是否是你的問題(這就是爲什麼這不是答案),但如果isInCategory不是局部變量,那麼你會得到這個錯誤。如果不是,則在'qry'行之前添加一行,表示'var expression = isInCategory;',然後在'qry'行中使用'expression'。 – DCShannon

回答

1

好的,在查看註釋中的代碼後,我可以建議如下: 將文章上的string CategoryID替換爲public virtual ICollection<Category> Categories { get; set; },因此EF將創建一個外鍵。於是,爲了得到物品,是在特定的類別,你可以使用類似於下面的代碼:

var articlesInCategory = context.Articles 
      .Where(x => x.Language == Thread.CurrentThread.CurrentCulture.Name) 
      .Where(x => x.Approved && x.Categories.Any(c => c.CategoryID == c1.CategoryID)).ToList(); 

而且當你要創建新的文章,你應該使用類似:

var c1 = context.Categories.OrderBy(c => c.Title).First(); 
var c2 = context.Categories.OrderBy(c => c.Title).Skip(1).First(); 
context.Articles.Add(new Article { Categories = new Collection<Category> { c1, c2 } }); 
context.SaveChanges(); 
+0

是否有任何樣品? –

+0

ps:我使用DbContext和Entityframe工作作爲我的ORM –

+0

正如我所瞭解您的isInCategory方法。您可以通過在item.CategoryID中以逗號分隔列出項目來將類別與項目相關聯。如果您不想更改體系結構,則可以通過簡單的x.CategoryID.Contains(category.CategoryID)替換isInCategory。這應該以幾乎相同的方式工作。就個人而言,我寧願用外鍵維護項目與類別的關聯。 –

相關問題