Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Sql到Linq嵌套联接_C#_.net_Linq - Fatal编程技术网

C# Sql到Linq嵌套联接

C# Sql到Linq嵌套联接,c#,.net,linq,C#,.net,Linq,我需要为下面提到的sql获取相应的Linq查询,我正在努力处理嵌套联接 SQL代码: 我尝试将查询分解成更小的部分,并尝试使用最初的2个连接 I tried to make a Linq for select * from (table1 INNER JOIN (table2 RIGHT JOIN table3 ON table2.StID = table3.StID) ON table1.SCode = table3.E

我需要为下面提到的sql获取相应的Linq查询,我正在努力处理嵌套联接

SQL代码: 我尝试将查询分解成更小的部分,并尝试使用最初的2个连接

    I tried to make a Linq for

    select * from
    (table1
    INNER JOIN
    (table2
    RIGHT JOIN
    table3
    ON table2.StID = table3.StID)
    ON table1.SCode = table3.ECode)


    Linq :

    var query = from rightJoin in
                           (
                              from t3 in table3
                              join t2 in table2
                              on t3.StID equals t2 .StID into joined
                              from T in joined.DefaultIfEmpty()
                              select new
                               {
                                    A = t3,
                                    B = T
                                }
                             )
                        join T1 in table1
                        on rightJoin.A.ECode equals T1.SCode into innerjoin
                        select new
                        {
                            C = rightJoin.A.ECode
                        };

             int i = query.Select(a => a.C).ToList().Count;
1) 上述linq是否适用于上述sql。我从sql和linq获得的记录数不同,因此我认为linq代码是不正确的

2) 我需要将原始sql转换为linq


任何帮助都将不胜感激。

也许你需要这样的帮助

示例类

public class table1
{
    public string SCode { get; set; }
}

public class table2
{
    public int StID { get; set; }
    public string Col1 { get; set; }
}

public class table3
{
    public int StID { get; set; }
    public int TypeID { get; set; }
    public int ValueID { get; set; }
    public int Num { get; set; }
    public int TValueID { get; set; }
    public string ECode { get; set; }
}

public class table4
{
    public int TypeID { get; set; }
}

public class table5
{
    public int ValueId { get; set; }
}
Linq实现:

var Select = from Table2 in dc.GetTable<table2>()                             
                         //Right Join                                                      
                         from Table3_3 in dc.GetTable<table3>()
                         .Where(item => item.StID == Table2.StID)
                         .Select(item => item)                             
                         //Inner Join From Right Join                                                                                       
                         join Table1_3_1 in dc.GetTable<table1>()                                 
                            on Table3_3.ECode equals Table1_3_1.SCode
                         //Left Join table4
                         join entityTable4 in dc.GetTable<table4>()
                            on Table3_3.TypeID equals entityTable4.TypeID into tempTable4
                         from Table4 in tempTable4.DefaultIfEmpty()
                         //Left Join table5
                         join entityTable5 in dc.GetTable<table5>()
                            on Table3_3.ValueID equals entityTable5.ValueId into tempTable5
                         from Table5 in tempTable5.DefaultIfEmpty()
                         //Left Join table2 (table6)
                         join entityTable2 in dc.GetTable<table2>()
                            on Table3_3.Num equals entityTable2.StID into tempTable2
                         from Table6 in tempTable2.DefaultIfEmpty()
                         //Left Join table5 (table7)
                         join entityTable5 in dc.GetTable<table5>()
                            on Table3_3.TValueID equals entityTable5.ValueId into tempTable5_7
                         from Table7 in tempTable5_7.DefaultIfEmpty()
                         //Filter
                         where Table2.Col1 == "1000"
                         select new
                         {  
                             table1 = new { SCode = (string)Table1_3_1.SCode },
                             table2 = new { StID = (int)Table2.StID, Col1 = (string)Table2.Col1 },
                             table3 = new
                             {
                                 StID = (int)Table3_3.StID,
                                 TypeID = (int)Table3_3.TypeID,
                                 ValueID = (int)Table3_3.ValueID,
                                 TValueID = (int)Table3_3.TValueID,
                                 Num = Table3_3.Num,
                                 ECode = Table3_3.ECode
                             },
                             table4 = Table4 == null ? null : new { TypeID = (int)Table4.TypeID },
                             table5 = Table5 == null ? null : new { ValueID = (int)Table5.ValueId },
                             table6 = Table6 == null ? null : new { StID = (int)Table6.StID, Col1 = (string)Table6.Col1 },
                             table7 = Table7 == null ? null : new { ValueID = (int)Table7.ValueId }
                         };
var Select=来自dc.GetTable()中的表2
//右连接
来自dc.GetTable()中的表3_3
.Where(item=>item.StID==表2.StID)
.选择(项目=>项目)
//右连接的内部连接
在dc.GetTable()中连接表1\u 3\u 1
在表3上,ECode等于表1
//左连接表4
在dc.GetTable()中连接entityTable4
在表3上,TypeID等于entityTable4.TypeID到entityTable4
从表4的tetrable4.DefaultIfEmpty()中
//左连接表5
在dc.GetTable()中连接entityTable5
在表3上,ValueID等于entityTable5.ValueID到entityTable5
从表5的tetrable5.DefaultIfEmpty()中
//左连接表2(表6)
在dc.GetTable()中连接entityTable2
在表3上,Num等于entityTable2.StID
从表6的tetrable2.DefaultIfEmpty()中
//左连接表5(表7)
在dc.GetTable()中连接entityTable5
在表3\u 3.TValueID等于entityTable5.ValueId
从表7中的Testable5_7.DefaultIfEmpty()
//滤器
其中Table2.Col1==“1000”
选择新的
{  
table1=新的{SCode=(字符串)table1\u 3\u 1.SCode},
table2=new{StID=(int)table2.StID,Col1=(string)table2.Col1},
表3=新
{
StID=(int)表3_3.StID,
TypeID=(int)表3\u 3.TypeID,
ValueID=(int)表3\u 3.ValueID,
TValueID=(int)表3\u 3.TValueID,
Num=表3_3.Num,
ECode=表3\u 3.ECode
},
table4=table4==null?null:new{TypeID=(int)table4.TypeID},
table5=table5==null?null:new{ValueID=(int)table5.ValueID},
table6=table6==null?null:new{StID=(int)table6.StID,Col1=(string)table6.Col1},
table7=table7==null?null:new{ValueID=(int)table7.ValueID}
};

试试这个。。。这对我来说是完美的工作

var query = (from a in objEntity.tblStock
                     join b in objEntity.tblScript on a.ScriptId equals b.ScriptId
                     join c in (from x in objEntity.tblScript join y in objEntity.tblSector on x.SectorId equals y.SectorId select new{x.ScriptId, x.SectorId, y.SectorName}) on a.ScriptId equals c.ScriptId
                     join d in objEntity.tblShareholder on a.ShareholderId equals d.ShareholderId
                     select new
                         {
                             a.StockId,
                             b.ScriptId,
                             b.SectorId,
                             a.ShareholderId,
                             b.ScriptName,
                             c.SectorName,
                             d.Shareholdername,
                         }).ToList();

我尝试了这个解决方案,但它给出了超时异常,我尝试将超时增加到2分钟,但仍然出现超时异常,而在Sql server中只需要0.01秒。我猜它在LINQ的某个地方进行交叉连接。您是否检查了LINQ生成的查询并与原始查询进行了比较?对我来说工作很好。也许你需要检查你的索引。
var query = (from a in objEntity.tblStock
                     join b in objEntity.tblScript on a.ScriptId equals b.ScriptId
                     join c in (from x in objEntity.tblScript join y in objEntity.tblSector on x.SectorId equals y.SectorId select new{x.ScriptId, x.SectorId, y.SectorName}) on a.ScriptId equals c.ScriptId
                     join d in objEntity.tblShareholder on a.ShareholderId equals d.ShareholderId
                     select new
                         {
                             a.StockId,
                             b.ScriptId,
                             b.SectorId,
                             a.ShareholderId,
                             b.ScriptName,
                             c.SectorName,
                             d.Shareholdername,
                         }).ToList();