2010-03-05 80 views
1

我遇到問題了我有3個數據表我反覆使用了緩存我想編寫一個LINQ語句以下是可能的嗎?轉換爲LINQ的C#SQL語句如何將此語句轉換爲工作LINQ

T-SQL版本:

SELECT P.[CID],P.[AID] 
,B.[AID], B.[Data], B.[Status], B.[Language] 
FROM MY_TABLE_1 P 
JOIN 
    (
    SELECT A.[AID], A.[Data], A.[Status], A.[Language] FROM MY_TABLE_2 A 
    UNION ALL 
    SELECT B.[AID], B.[Data], B.[Status], B.[Language] FROM MY_TABLE_3 B 
) B on P.[AID] = B.[AID] 
WHERE B.[Language] = 'EN' OR B.[Language] = 'ANY' AND B.STATUS = 1 AND B.[Language] = 'EN' OR B.[Language] = 'ANY' AND B.STATUS = 1 

那我想它來創建一個結果集以下

結果: | CID | AID |數據|狀態|語言

+0

從System.Data.DataSetExtensions.dll中的DataTable.AsEnumerable()開始 – 2010-03-08 00:03:47

回答

1

請確保您引用了System.Data.DataSetExtensions,並使用AsEnumerable()方法來使用LINQ to DataSets。

  var myTable1 = new [] { 
      new { CID = "123", AID = 345, Data = 32323, Status = 1, Language = "EN"}, 
      new { CID = "231", AID = 123, Data = 11525, Status = 2, Language = "EN"}, 
      new { CID = "729", AID = 513, Data = 15121, Status = 1, Language = "ANY"}, 
      new { CID = "231", AID = 123, Data = 54421, Status = 2, Language = "EN"}} 
      .ToDataTable().AsEnumerable(); 

     var myTable2 = new [] { 
      new { CID = "512", AID = 513, Data = 32323, Status = 1, Language = "ANY"}, 
      new { CID = "444", AID = 123, Data = 11525, Status = 2, Language = "BLAH"}, 
      new { CID = "222", AID = 333, Data = 15121, Status = 1, Language = "ANY"}, 
      new { CID = "111", AID = 345, Data = 54421, Status = 2, Language = "EN"}} 
      .ToDataTable().AsEnumerable(); 

     var myTable3 = new [] { 
      new { CID = "888", AID = 123, Data = 32323, Status = 2, Language = "EN"}, 
      new { CID = "494", AID = 333, Data = 11525, Status = 1, Language = "FR"}, 
      new { CID = "202", AID = 513, Data = 15121, Status = 1, Language = "EN"}, 
      new { CID = "101", AID = 345, Data = 54421, Status = 2, Language = "ANY"}} 
      .ToDataTable().AsEnumerable(); 

     var q = from p in myTable1 
       join b in myTable2.Union(myTable3) on p.Field<int>("AID") equals b.Field<int>("AID") 
       where (b.Field<string>("Language") == "EN" || b.Field<string>("Language") == "ANY") && b.Field<int>("Status") == 1 
       select new 
       { 
        CID = p.Field<string>("CID"), 
        B_AID = p.Field<int>("AID"), 
        P_AID = b.Field<int>("AID"), 
        Data = b.Field<int>("Data"), 
        Status = b.Field<int>("Status"), 
        Language = b.Field<string>("Language") 
       }; 


     var table = q.ToDataTable(); 

我使用的擴展方法,你可以找到here來測試這一點,如果你在數據表做了很多的LINQ這是非常有用的。

4

試試這個:

from p in Context.MyTable1 
join b in Contact.MyTable2.Concat(Contact.MyTable3) 
    on p.aid equals b.aid 
where b.Language == "EN" || b.Language == "ANY" 
where b.Status == 1 
select new 
{ 
    p.CID, 
    p.AID, 
    b.Data, 
    b.Status, 
    b.Language 
}; 
+2

Context.MyTable1?環境來自哪裏? – BlackTea 2010-03-06 00:22:21

+1

@BlackTea - 通常,如果你在處理LINQ,那麼它就在DataContext(Linq-to-Sql,EF等)中,如果你處理直線列表或者其他任何工作方式都是一樣的......只要使用任何對象你會反對。 – 2010-03-06 00:42:54

+0

我的表是高速緩存的DataTable結果....它們在Application Start上加載。所以你說的只是把兩張桌子連在一起? – BlackTea 2010-03-06 00:48:53

2

不要這樣做。

你兩個選擇

  1. 創建,它代表了聯盟的聲明(表2和表3)
  2. 創建於表1和對AID列的新視圖之間的DBML的關係的看法。
  3. 做一個SelectMany來獲得您需要的返回結果。

或(和優選的)

  • 創建接受的語言/狀態(假設它們是參數),並返回該數據集的存儲過程。這將是最有效的方法。

您正在做業務邏輯中的數據庫工作!使用數據庫來實現它的目的。

+2

我不能在數據庫上這樣做,這是我的問題,我需要使用緩存數據,因爲沒有數據庫交互。 – BlackTea 2010-03-06 00:21:13