将Sql转换为LINQ复杂C#函数以读取sql server字符串

时间:2015-07-07 12:22:06

标签: c# sql linq

我读了很多关于从c#linq到sql函数获取可读的sql server查询字符串,但无法弄清楚如何实际执行此操作,可能是因为我正在处理的项目非常复杂。

我粘贴了一些我希望转换为sql的代码(select * from bonds join etc.)

public List<EntBondPortfolio> GetBondsForPortfolio(List<int> groups, List<int> ratings,
  List<int> collaterals, List<int> companies, List<int> countries, List<int> fields,
  List<int> currencies, DateTime? fromExpirationDate, DateTime? untilExpirationDate, bool? perpetual, int? sortOrder = 1)
{
 // Get Bonds
 return (from bond in DALLinqClasses.Instance.BONDs
         join company in DALLinqClasses.Instance.COMPANies on bond.Company_ID equals company.CompanyID
         into companyJoin
         from companyJ in companyJoin.DefaultIfEmpty()
         join sellBuy in DALLinqClasses.Instance.SELL_BUY_OPERATIONs on bond.BondID equals sellBuy.Investment_ID
         join account in DALLinqClasses.Instance.BANK_ACCOUNTs on sellBuy.BankAccount_ID equals account.BankAccountID
         join groupsTable in DALLinqClasses.Instance.GROUPs on account.GroupAccount_ID equals groupsTable.GroupID
         join customer in DALLinqClasses.Instance.CUSTOMERs on groupsTable.Customer_ID equals customer.CustomerID
         join rating in DALLinqClasses.Instance.RATINGs on bond.Rating_ID equals rating.RatingID
         into ratingJoin
         from ratingJ in ratingJoin.DefaultIfEmpty()
         join currency in DALLinqClasses.Instance.CURRENCies on bond.Currency_ID equals currency.CurrencyID
         join country in DALLinqClasses.Instance.COUNTRies on bond.Country_ID equals country.CountryID
         into countryJoin
         from countryJ in countryJoin.DefaultIfEmpty()
         join field in DALLinqClasses.Instance.FIELDs on bond.Field_ID equals field.FieldID
         into fieldJoin
         from fieldJ in fieldJoin.DefaultIfEmpty()



         join collateral in DALLinqClasses.Instance.RISC_LEVELs on bond.RiscLevel_ID equals collateral.RiscLevelID
         into collateralJoin
         from collateralJ in collateralJoin.DefaultIfEmpty()

         join orderi in // For order by
             DALLinqClasses.Instance.PORTFOLIO_ORDERs.Where(x => x.InvestmentType_ID == (int)INVESTMENT_TYPES.BONDS)
             on new EntTwoInts { BankAccountID = bond.BondID, GroupID = groupsTable.GroupID }
             equals
             new EntTwoInts { BankAccountID = orderi.Investment_ID, GroupID = orderi.Group_ID }
             into orderJoin
         from orderJ in orderJoin.DefaultIfEmpty()

         where sellBuy.InvestmentType_ID == (int)INVESTMENT_TYPES.BONDS
         && groups.Contains(groupsTable.GroupID)
         && (collaterals.Contains(bond.RiscLevel_ID ?? -1) || collaterals.Contains(-1))
         && (ratings.Contains(bond.Rating_ID ?? -1) || ratings.Contains(-1))
         && (companies.Contains(bond.Company_ID ?? -1) || companies.Contains(-1))
         && (countries.Contains(bond.Country_ID ?? -1) || countries.Contains(-1))
         && (fields.Contains(bond.Field_ID ?? -1) || fields.Contains(-1))
         && (currencies.Contains(bond.Currency_ID) || currencies.Contains(-1))
         && (bond.ExpirationDate >= fromExpirationDate || fromExpirationDate == null)
         && (bond.ExpirationDate <= untilExpirationDate || untilExpirationDate == null)
         && (perpetual == bond.Perpetual || perpetual == null)


         group sellBuy by new { bond, companyJ, groupsTable, account, orderJ, customer, ratingJ, collateralJ, countryJ, fieldJ } into g

         orderby g.Key.orderJ != null ? false : true, g.Key.orderJ.SortOrder, g.Key.groupsTable.GroupName, g.Key.companyJ.CompanyName
         select new EntBondPortfolio
         {
             Rating = g.Key.ratingJ.RatingName,
             RiscLevel = g.Key.collateralJ.RiscLevelName,
             Group = g.Key.groupsTable.GroupName,
             Client = g.Key.customer.FirstName + ' ' + g.Key.customer.LastName,
             GroupId = g.Key.groupsTable.GroupID,
             Company = g.Key.companyJ.CompanyName,
             CurrencyId = g.Key.bond.Currency_ID,
             BondId = g.Key.bond.BondID,


             CallText = g.Key.bond.CallText,
             Field = g.Key.fieldJ.FieldName,
             Country = g.Key.countryJ.CountryName,


             CouponPercent = g.Key.bond.CouponPercent,
             // Get total sum of coupons in checking account of current bond
             CouponsPaid = DALLinqClasses.Instance.CHECKING_ACCOUNTs.
                             Where(x => x.ActionType_ID == (int)ACTION_TYPES.COUPON
                             && g.Select(y => y.SellBuyOperationID).
                             Contains(x.SellBuyOperation_ID.GetValueOrDefault()))
                             .Sum(s => s.ActualSum),
             ExpirationDate = g.Key.bond.ExpirationDate,
             FaceValue = (g.Where(x => x.IsSell == false).Sum(x => x.FaceValue) - (g.Where(x => x.IsSell == true).Sum(x => x.FaceValue) ?? 0)),
             Isin = g.Key.bond.Isin,
             LastBuyDate = g.Where(x => x.IsSell == false).Max(x => x.SellBuyOperationDate),
             CurrentPrice = DALInvestmentTypes.Instance.GetCurrentPriceOfBond(g.Key.bond.BondID, BONDS_HISTORY_TYPES.MarketValue),
             CurrentYield = DALInvestmentTypes.Instance.GetCurrentPriceOfBond(g.Key.bond.BondID, BONDS_HISTORY_TYPES.Yield),
             CurrentAcrInterest = DALInvestmentTypes.Instance.GetCurrentPriceOfBond(g.Key.bond.BondID, BONDS_HISTORY_TYPES.AcrInterest),


             PurchasePrice = g.Where(x => x.IsSell == false).Sum(x => x.FaceValue) == 0 ? 0 :
             g.Where(x => x.IsSell == false).Sum(x => x.FaceValue * x.Price)
             / g.Where(x => x.IsSell == false).Sum(x => x.FaceValue),


             Instruction = DALInstructions.Instance.IsInvestmentHaveInstruction(INVESTMENT_TYPES.BONDS, g.Key.bond.BondID, g.Key.account.BankAccountID),
         }).ToList();

}

0 个答案:

没有答案