2009-11-11 51 views
1

我迷失在linq-land,試圖把這個SQL(它給我需要的結果)變成linq/C#中的東西。結果將以SelectList結束。linq沒有在查詢

select Agencies.AgencyName, Agencies.AgencyId 
from Agencies 
where Agencies.Active = 1 and Agencies.AgencyId not in (
    select distinct Agencies.AgencyId 
    from Agencies, AgenciesDonors 
    where AgenciesDonors.AgencyId = Agencies.AgencyId and 
     AgenciesDonors.DonorId = '73B29E01-8BF0-4EC9-80CA-089BA341E93D') 

Guid值將在每次傳遞。

經過漫長的一天無處不在的幫助非常感激。

編輯:我應該說我在MVC 1.0/EF上下文中工作。不知道如何改變最初的答案。

回答

1

這應該做的伎倆

var query = from c in dc.Agencies 
      where c.agencies == 1 && 
        !(from o in dc.AgenciesDonors 
        where o.DonorId = myDonorId 
      select o.AgencyId).Contains(c.AgencyId) 
      select c; 

的LINQ to SQL將會把不包含到一個不存在通常具有比未在SQL語句更好的性能。

1

除非我錯過了一些東西,否則將代理表引入子查詢是不必要的。所以,這樣的事情應該工作:

from a in dataContext.Agencies 
where a.Active == 1 && 
     !(from inner in dataContext.AgenciesDonors 
     where inner.DonorId == donorID 
     select inner.AgencyId).Contains(a.AgencyId) 
select a 
0
var query = from a in dc.Agencies 
      let ad = from o in dc.AgenciesDonors 
        where o.DonorId = myDonorId 
        select o.Agencies.AgencyId 
      where a.Active == 1 && !ad.Contains(a.AgencyId) 
      select c; 

我覺得這是一個整潔的語法,因爲它否定了必要巢AgenciesDonors連接語句,以機構獲得AgencyId,這必須執行上DataContext(dc),因爲在「let」語句中的o.Agencies.AgencyId只在以IQueryable運行時才起作用

+0

對不起,但我需要做什麼來獲得一個直流與我在MVC/EF設置,我已經有一個數據庫使用EntitySets? – Dale 2009-11-11 23:03:34

+0

基本上,當您添加edmx(對於EF)時應創建dc,因此您的datacontext是通過EF調用數據庫時使用的類 – Neil 2009-11-12 06:46:33