简体   繁体   English

C#SQL语句转换为LINQ我如何将此语句转换为可用的linq

[英]C# SQL Statement transformed TO LINQ how can i translate this statement to a working linq

I am having trouble with this I have 3 Data tables i use over and over again which are cached I would like to write a LINQ statement which would do the following is this possible? 我对此有麻烦,我有3次重复使用的数据表,这些数据表被缓存了,我想写一个LINQ语句,这样做可能吗?

T-SQL VERSION: 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

Then i would like it to create a result set of the following 然后我希望它创建以下结果集

Results: |CID|AID|DATA|STATUS|LANGUAGE 结果: | CID | AID | DATA |状态|语言

Try this: 尝试这个:

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
};

Don't do it this way. 不要这样

Your two options 您的两个选择

  1. Create a view which represents your Union statement (Table2 and Table3) 创建一个表示您的Union语句的视图(表2和表3)
  2. Create a relationship on the DBML between Table1 and the new view on the AID column. 在Table1和AID列上的新视图之间的DBML上创建关系。
  3. Do a SelectMany to get your required return result. 执行SelectMany以获取所需的返回结果。

or (and preferred) 或(首选)

  • Create a stored procedure that accepts the language / status (assuming they are parameters) and returns this data set. 创建一个接受语言/状态(假设它们是参数)的存储过程,并返回此数据集。 This will be the most efficient method. 这将是最有效的方法。

You are doing database work in your business logic! 您正在按照业务逻辑进行数据库工作! Use the database for what it was intended. 使用数据库以达到预期的目的。

Make sure you reference System.Data.DataSetExtensions, and use the AsEnumerable() method to use LINQ to DataSets. 确保引用System.Data.DataSetExtensions,并使用AsEnumerable()方法对数据集使用LINQ。

            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();

I used an extension method you can find here to test this, it's pretty useful if you are doing a lot of LINQ over DataTables. 我使用了一种扩展方法,可以在此处进行测试,如果您在DataTables上执行大量的LINQ,这将非常有用。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM