2011-11-04 132 views
0

我有2個表,我需要一直加載在一起,兩者必須一起存在於數據庫中。不過,我很奇怪,爲什麼Sql的Linq要求,我有一個集合中加載,然後做一個連接,我只想加入2個單桌哪里哪里芳族聚酰胺創紀錄的說= 5,例如...Linq to Sql:加入,爲什麼我需要加載集合

var data = _repo.All<TheData>(); //why do I need a collection/IQueryable like this? 

var _workflow = _repo.All<WorkFlow>() 
       .Where(x => x.WFID== paramid) 
       .Join(data, x => x.ID, y => y.WFID, (x, y) => new 
       { 
        data = x, 
        workflow = y 
       }); 

我覺得我需要做一個SingleOrDefault()?如果記錄不是空傳回來?

我瞭解Sql查詢出來正確,有沒有更好的方式來寫這個?

注:我需要尋找一個叫做Participants表,看是否loggedonuser實際上可以鑑於這種記錄,所以我想我應該離開,因爲這個? (這是主要的需求)

var participant = _repo.All<Participants>(); 

.Any(x=> x.ParticipantID == loggedonuser.ID); //add this to above query... 

回答

1

var data = _repo.All<TheData>();是一樣的東西說「開始建立對海圖表查詢」。 此函數返回一個IQueryable,它將包含對數據庫的查詢定義。

所以這並不意味着你用這一行加載整個TheData表數據!

查詢將在您執行類似.Count(),.Any(),First(),Single()或ToList()等操作時執行。這稱爲延期執行。

如果你想用SingleOrDefault()結束查詢,這將創建一個連接兩個表的sql查詢,添加過濾器並選擇最上面的記錄或null(或者如果還有更多的話會拋出一個錯誤!)。

您也可以使用Linq代替查詢擴展方法。 它看起來像:

var data = _repo.All<TheData>(); 

var _workflow = from w in _repo.All<WorkFlow>() 
       join t in _repo.All<TheData> on w.Id equals t.WFID 
       where x.WIFD = paramid 
       select new 
       { 
        data = t, 
        workflow = x 
       });