【问题标题】:How can I Write This SQL Query to Linq Query [duplicate]如何将此 SQL 查询写入 Linq 查询 [重复]
【发布时间】:2016-03-07 12:31:59
【问题描述】:
    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 查询的形式编写此 SQL 查询.. 并且特别是查询的最后一行。要写入 LINQ 查询

我写这个查询来解决我的问题。

(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 join SORD in db.tblSOReturnDetails on SOD.SODetID 等于 SORD.SODetID into 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();

【问题讨论】:

  • 到目前为止你尝试了什么?
  • 问题没有显示任何研究工作,请告诉我们您尝试了什么。
  • 使用此代码获得解决方案...。 1. SOD.Qty > (((System.Decimal?)(OD.TotQty) ?? (System.Decimal?)0) + ((System.Decimal?)(SORD.TotQty) ?? (System.Decimal?) 0))

标签: sql-server linq


【解决方案1】:

LINQ 中有 fluent 和 query 表达式样式 如果您希望您的项目数据访问使用 LINQ。然后,您需要从其中一种 LINQ 样式开始编写查询。 我不建议编写 sql 查询然后转换它,这样做会浪费很多时间。一旦您熟悉并熟悉 LINQ,您会发现使用 LINQ 开始查询比转换要容易得多。

使用 Query 表达式对于 JOINING 表的初学者来说更容易,而对于仅从一个表中检索数据 Fluent 样式要容易得多。

所以从查询样式开始

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

或者你可以使用流畅的样式

Join 运算符有许多参数:

  • IEnumerable inner - 内部序列。
  • Func outerKeySelector – 在外部序列中加入什么键 元素。
  • Func innerKeySelector - 在内部序列中加入什么键 元素。
  • Func resultSelector – 输出元素将做什么 看起来像

Table1.Join(Table2, (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
 };

【讨论】:

  • 谢谢...哈桑...对我很有帮助。
  • 欢迎您提供更多有关 LINQ 的详细信息,然后我将在一本书中提出建议,该书以完美的方式解释了所有细节。它被称为LINQ_Succinctly,我认为它是免费的。最后一件事,如果我的回答对您有帮助,请将其标记为已解决或 +1 答案。
猜你喜欢
  • 2021-01-15
  • 1970-01-01
  • 1970-01-01
  • 2011-09-10
  • 1970-01-01
  • 1970-01-01
  • 2014-10-13
  • 2012-10-11
  • 2013-04-30
相关资源
最近更新 更多