C# 转换为LINQ的C SQL语句如何将此语句转换为工作LINQ

C# 转换为LINQ的C SQL语句如何将此语句转换为工作LINQ,c#,asp.net,sql,linq,datatable,C#,Asp.net,Sql,Linq,Datatable,我有问题,我有3个数据表,我使用了一遍又一遍的缓存我想写一个LINQ语句,它会做以下事情这是可能的吗 T-SQL版本: 然后,我希望它创建以下结果集 结果: |CID | AID |数据|状态|语言尝试以下方法: 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 =

我有问题,我有3个数据表,我使用了一遍又一遍的缓存我想写一个LINQ语句,它会做以下事情这是可能的吗

T-SQL版本:

然后,我希望它创建以下结果集

结果: |CID | AID |数据|状态|语言

尝试以下方法:

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
};
试试这个:

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
};
不要这样做

你的两个选择

创建一个表示Union语句表2和表3的视图 在DBML上创建Table1和AID列上的新视图之间的关系。 执行SelectMany以获得所需的返回结果。 或者更喜欢

创建一个存储过程,该存储过程接受语言/状态(假设它们是参数),并返回此数据集。这将是最有效的方法。 您正在业务逻辑中进行数据库工作!使用数据库达到预期目的。

不要这样做

你的两个选择

创建一个表示Union语句表2和表3的视图 在DBML上创建Table1和AID列上的新视图之间的关系。 执行SelectMany以获得所需的返回结果。 或者更喜欢

创建一个存储过程,该存储过程接受语言/状态(假设它们是参数),并返回此数据集。这将是最有效的方法。
您正在业务逻辑中进行数据库工作!按预期使用数据库。

确保引用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();

我使用了您可以找到的扩展方法来测试这一点,如果您在DataTables上执行大量LINQ,它非常有用。

请确保引用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();

我使用了一种您可以找到的扩展方法来测试这一点,如果您在DataTables上执行大量LINQ,它非常有用。

我不能在DB上执行此操作这是我的问题我需要处理缓存数据,因为没有DB交互。我不能在DB上执行此操作这是我的问题我需要处理缓存数据,因为没有DB交互。Context.MyTable1?上下文突然从何而来?@BlackTea-通常,如果你在处理LINQ,它在DataContextLinq到Sql、EF等的范围内,如果你在处理直接列表或其他类似的东西……只要使用你反对的对象就行了。我的表是缓存的DataTable结果。。。。在应用程序启动时加载。那么你是说只将这两个表连接在一起?@BlackTea-是的。Concat将附加这两个表,相当于SQL world.Context.MyTable1中的一个UNION ALL?上下文突然从何而来?@BlackTea-通常,如果你在处理LINQ,它在DataContextLinq到Sql、EF等的范围内,如果你在处理直接列表或其他类似的东西……只要使用你反对的对象就行了。我的表是缓存的DataTable结果。。。。在应用程序启动时加载。那么你是说只将这两个表连接在一起?@BlackTea-是的。Concat将附加这两个表,相当于SQL世界中的一个UNION ALL。从System.Data.DataSetExtensions.dllStart中的DataTable.AsEnumerable开始,在System.Data.DataSetExtensions.dll中添加DataTable.AsEnumerable