2012-05-09 44 views
0

我試圖產生這個查詢與實體構架dbContext如何產生,其中,查詢與子查詢的實體框架4.1

SELECT  id 
FROM   menuitems 
WHERE  (parent_id = 11) 
UNION 
SELECT  id 
FROM   menuitems AS menuitems_2 
WHERE  (parent_id IN 
    (SELECT  id 
    FROM   menuitems AS menuitems_1 
    WHERE  (parent_id = 11))) 

表的菜單項有2列:ID,PARENT_ID

我嘗試這樣:

List<int> mi = ctx.MenuItems.Where(i => i.parent_id == this.id).Select(id => id.id) 
.Union(ctx.MenuItems.Where(c => ctx.MenuItems 
       .Where(i => i.parent_id == this.id).Select(id => id.id) 
       .Contains((int)c.parent_id)).Select(id => id.id)) 
       .ToList(); 

,但它不工作,我becouse得到如下因素的錯誤:

Unable to create a constant value of type 'Menuitem'. Only primitive types ('such as Int32, String, and Guid') are supported in this context. 

有沒有辦法產生這個查詢?

回答

0

可以打破這種分爲兩個簡單的查詢:

List<int> allItems=new List<int>(); 
var items= menuitems.Where(m=>m.parent_id == 11).Select(m=>m.id); 
var children= menuitems.Where(items.Contains(m=>m.parent_id)).Select(m=>m.id); 
allItems.AddRange(items.ToList()); 
allItems.AddRange(children.ToList()); 

我敢肯定,做你綁到做同樣的事情。實際上,你可以這樣做一個這樣的查詢:

List<int> allItems=new List<int>(); 
var items= menuitems.Where(m=>m.parent_id == 11).Select(m=>m.id) 
allItems= items.Union(menuitems.Where(items.Contains(m=>m.parent_id)).Select(m=>m.id)); 

返回allItems時,該查詢只運行一次。即使它看起來像兩個查詢,但Linq在最終對象請求它之前不會運行查詢。

+0

thx for reply。我想知道我是否可以用一個查詢來做到這一點...所以問題是如何使用包含子查詢。 – Wnk

+0

我爲此添加了一個聯合。如果這是你正在尋找的,請選擇作爲答案。 – Slick86