2010-03-05 79 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