2014-03-25 28 views
2

我有以下疑問:的Linq工會的SQL代碼都相當於

var majorClients = maj in dbContext.MajorClients 
        where (maj.startdate > startDate) 
        where (maj.status == "Active") 
        Select new Client{EntityPK = maj.mjPrimaryKey,Name = maj.name, Type = "Maj"}; 

var minorClients = min in dbContext.MinorClients 
        where (min.startdate > startDate) 
        where (min.status == "Active" || min.status== "Inactive") 
        Select new Client{EntityPK = min.mnPrimaryKey,Name = min.name, Type = "Min"}; 

有可能出現在主要和次要表的客戶。我想返回兩個表中所有客戶端的列表,但是如果按名稱匹配客戶端,那麼我只想從majorClients表中返回匹配的記錄。

我已經寫了一個SQL查詢返回的結果:

SELECT mjPrimaryKey AS EntityPK,name,'Maj' AS TYPE 
FROM majorClients 
WHERE status = 'Active' AND startDate > @startDate 
UNION ALL 
SELECT mnPrimaryKey,name,'Min' FROM minorClients 
WHERE status IN ('Active','Inactive') AND startDate > @startDate 
WHERE name NOT IN (SELECT name FROM majorClients WHERE status = 'Active' AND startDate > @startDate) 

我怎麼會代表LINQ此查詢?

回答

1

試試這個linq。要從minorClients中排除重複項,我已使用Contains方法。聯合所有對象 - Union方法:

var majorClients = from maj in dbContext.MajorClients 
        where maj.startdate > startDate 
         && maj.status == "Active" 
        select new Client 
        { 
         EntityPK = maj.mjPrimaryKey, 
         Name = maj.name, 
         Type = "Maj" 
        }; 

var minorClients = from min in dbContext.MinorClients 
        where min.startdate > startDate 
         && min.status == "Active" || min.status== "Inactive" 
         && !(from maj in dbContext.MajorClients 
          where maj.startdate > startDate 
           && maj.status == "Active" 
          select maj.name).Contains(min.Name) 
        select new Client 
         { 
          EntityPK = min.mnPrimaryKey, 
          Name = min.name, 
          Type = "Min" 
         }; 

var allClients = majorClients.Union(minorClients); 
+0

感謝您的回覆。當我運行你的代碼時,我得到以下錯誤:LINQ to Entities不支持指定的類型成員'Name'。僅支持初始化程序,實體成員和實體導航屬性。 我認爲它表示新客戶端對象中的「名稱」與數據庫等效名稱無關。 – breakerdotnet

+0

是的,我忘了它。我改變了答案,請再次檢查。 – alexmac

+0

謝謝你的作品。可惜這個查詢運行了兩次,但我明白sql版本也運行了兩次。在這個例子中,我刪除了其他條件爲簡單。添加5個左右的附加條件確實會使讀起來更難一些。無論如何,感謝您的解決方案。 – breakerdotnet