2016-03-07 107 views
0
SELECT DISTINCT SOM.CompanyID, 
SOM.BranchID, 
SOM.SOID, 
SOM.TranDocNo, 
SOM.DocDate, 
CM.CustomerName, 
STM.SaleTypeName, 
SOM.NetAmount, 
SOM.TotQty 
FROM tblSODetails SOD WITH (NOLOCK) 
INNER JOIN tblSOMaster SOM WITH (NOLOCK) ON (SOD.SOID = SOM.SOID) 
INNER JOIN tblSaleTypeMaster STM WITH (NOLOCK) ON (SOM.SaleTypeID = STM.SaleTypeID) 
INNER JOIN tblCustomerMaster CM WITH (NOLOCK) on (SOM.CustomerID = CM.CustomerID) 
LEFT OUTER JOIN tblSOReturnDetails SORD WITH (NOLOCK) ON (SOD.SODetID = SORD.SODetID) 
LEFT OUTER JOIN tblSOReturnMaster SORM WITH (NOLOCK) ON (SORD.SOReturnID = SORM.SOReturnID) 
LEFT OUTER JOIN tblOutwardMaster OM WITH (NOLOCK) ON (SOM.TranDocNo = OM.RefTranDocNo) 
LEFT OUTER JOIN tblOutwardDetails OD WITH (NOLOCK) ON (OM.OutwardID = OD.OutwardID AND OD.ItemID = SOD.ItemID) 
WHERE SOM.CompanyID = 1 
and SOM.BranchID = 1 
and SOM.IsOutward = 0 
and SOM.DocTypeID = 3 
and SOM.IsSOReturn = 0 
and SOM.IsDealer = 0 
and STM.IsStockEffect = 1 
and STM.IsSaleOrder = 1 
and SOM.Status = 'AP' 
and CM.IsBlackListed = 0 
AND SOD.Qty > (ISNULL(OD.Qty,0) + ISNULL(SORD.Qty,0)) 

如何在窗体的LINQ查询.. ,具体的最后一道Query.To写在LINQ查询我怎么可以这样写SQL查询到LINQ查询

我写这篇文章写这个SQL查询查询来解决我的问题。

(from SOD in db.tblSODetails 
           join SOM in db.tblSOMasters on SOD.SOID equals SOM.SOID 
           join STM in db.tblSaleTypeMasters on SOM.SaleTypeID equals STM.SaleTypeID 

SOM.CustomerID等于CM.CustomerID 在SOD.SODetID db.tblSOReturnDetails加入SORD等于SORD.SODetID到SORD_join

       from SORD in SORD_join.DefaultIfEmpty() 



           from CM in db.tblCustomerMasters.Where(
           CM => CM.CustomerID == SOM.CustomerID && (CM.IsBlackListed == false)) 
           SOD.SODetID).DefaultIfEmpty() 

           join SORM in db.tblSOReturnMasters on SORD.SOReturnID equals SORM.SOReturnID into SORM_join 

           from SORM in SORM_join.DefaultIfEmpty() 

           join OM in db.tblOutwardMasters on new { TranDocNo = SOM.TranDocNo } equals 
           new { TranDocNo = OM.RefTranDocNo } into OM_join 

           from OM in OM_join.DefaultIfEmpty() 

           join OD in db.tblOutwardDetails on new { OM.OutwardID, SOD.ItemID } equals 
           new { OD.OutwardID, OD.ItemID } into OD_join 

           from OD in OD_join.DefaultIfEmpty() 

           where (SOM.CompanyID == compID) 
          && (SOM.BranchID == BranchID) 
          && ((isOutward == -1) || (SOM.IsOutward == (isOutward == 1 ? true : false))) 
          && (SOM.DocTypeID == 3) 
          && (SOM.Status == "AP") 
          && (SOM.IsSOReturn == false) 
          && (SOM.IsDealer == false) 
          && (STM.IsStockEffect == true) 
          && (STM.IsSaleOrder == true) 
          && ((SOM.TranDocNo.Contains(strDocTypeCode))) 
          && SOD.Qty > (((System.Decimal?)(OM.TotQty) ?? (System.Decimal?)0) + ((System.Decimal?)(SORM.TotQty) ?? (System.Decimal?)0)) 

           select new 
           { 
            SOM.CompanyID, 
            SOM.BranchID, 
            SOM.SOID, 
            TranDocNo = SOM.TranDocNo, 
            DocDate = SOM.DocDate, 
            CustomerName = CM.CustomerName == null ? "" : CM.CustomerName, 
            DealerName = "", 
            STM.SaleTypeName, 
            NetAmount = SOM.NetAmount, 
            TotQty = SOM.TotQty 
           } 
          ).Distinct(); 
+0

到目前为止您尝试了什么? – Daniel

+0

问题没有显示任何研究工作,请告诉我们你有什么尝试。 – gofr1

+0

使用此代码获得解决方案。 1. SOD.Qty>(((System.Decimal?)(OD.TotQty)??(System.Decimal?)0)+((System.Decimal?)(SORD.TotQty)??(System.Decimal?)0)) –

回答

1

有一个在LINQ 流畅和查询表达式的风格,如果你想您的项目数据访问使用LINQ。然后,您需要开始使用LINQ样式之一开始编写查询。 我不建议写sql查询然后转换它,你会浪费很多时间做这件事。一旦你对LINQ很熟悉并且很熟悉,你会发现使用LINQ而不是转换开始查询要容易得多。

使用查询表达是连接表的begineer更容易,而从一个表只是retriving数据流利款式容易得多。

如此虐待开始与查询风格

from thing1 in table1 join thing2 in table2 on thing1.Id equals thing2.Thing1Id 
select new // anonymous type 
{ 
Thing1Column= thing1.SomeColumn, 
Thing2Comumn= thing2.SomeColumn, 
BlaBlaBla= thingX.blablabla 
}; 

,或者您可以使用流利式

连接操作符需要多个参数:

  • 的IEnumerable内 - 内部序列。
  • Func outerKeySelector - 在外部序列 元素中加入的密钥。
  • Func innerKeySelector - 在内部序列 元素中加入什么键。
  • Func键resultSelector - 什么输出元件将 像

Table1.Join(表2,(Thing1 outerKey)=> outerKey.Id,(Thing2 innerKey)=> innerKey.Thing1Id,( thing1,thing2)=> thing1.AnyColumn +“ - ”+ thing2.AnyOtherColumn);

Thing1是类(模型) thing1是从该类

的对象是为内部为左外则需要DefaultIfEmpty() ,让你具有在没有匹配的元件的结果第二张桌子

from thing1 in table1 join thing2 in table2 on thing1.Id equals thing2.Thing1Id into thingies2Group from x in reviewGroup.DefaultIfEmpty(new Thing2{MayBeEmptyValuesColumn= "DefaultValueIfEmpty"}) 
select new // anonymous type 
{ 
Thing1Column= thing1.SomeColumn, 
Thing2Comumn= x.MayBeEmptyValuesColumn, 
BlaBlaBla= thingX.blablabla 
}; 
+0

谢谢...哈桑...这是对我完全帮助。 –

+0

欢迎您提供关于LINQ的更多详细信息,然后我会在一本书中提供建议,以完美的方式解释所有细节。它被称为[LINQ_Succinctly](https://www.syncfusion.com/resources/techportal/ebooks/linq),我认为它是免费的。最后一件事,如果我的答案可以帮助你,请标记为已解决或答案+1。 – Hasan