2013-04-29 65 views
0

希望EF/linq guru可以幫助我完成一個非常簡單的查詢(就像在SQL中一樣)。這裏是什麼,我試圖做的僞代碼:EF子查詢(其中第一個查詢中的列包含另一個列表中的值)

查詢:

var query1 = FROM tableA in Models.TableAs 
       select tableA 

QUERY B:

var query2 = FROM tableB in Models.TableBs 
      WHERE tableB.ColumnA IN (query1.results.columnB) 

我的實際查詢更爲複雜,不能用簡單的表示加入。我需要實際運行第一個查詢以基本獲取用於在第二個查詢中過濾值的列​​表值。有人有主意嗎?

謝謝!

回答

1

像這樣的事情也許

var query1 = from tableA in Models.TableAs 
      select tableA 

var query2 = from tableB in Models.TableBs 
     where query1.Any(ta=>tableB.ColumnA==ta.ColumnB); 
0

您正在從Entity Framework的錯誤方向着眼於此。

SELECT * FROM TABLEA 
WHERE TABLEA.COLUMNA IN (TABLEB.COLUMNB) 

使用IN:

在SQL中,你喜歡會寫東西。

如果我們有模型是這樣的:

public class TableA 
{ 
    public TableBEntity TableB {get;set;} 
} 

public class TableB 
{ 
    public IEnumerable<TableAEntity> TableA {get;set;} 
} 

在EF,試試這個方法:

from myvar in context.TableB select myvar.TableA 
+0

謝謝,這有助於理解如何看待這個問題。 – user2041189 2013-04-29 15:34:54

0

我相信,無論是法律上的查詢或本查詢會得到相同的結果,但我認爲它們會生成不同的SQL,其中一個可能會比另一個更快。你可以試着看看哪一個更好的表現。

var query1 = from tableA in Models.TableAs 
      select tableA.columnB; 

var query2 = from tableB in Models.TableBs 
     where query1.Contains(tableB.ColumnA) 
     select tableB; 
+0

謝謝!你是對的,這個答案和正確的答案都會返回正確的結果。我選擇了由jure becuase提出的選項,我比較容易找出如何使它與比較兩列一起工作。 – user2041189 2013-04-29 15:34:32

相關問題