2014-10-27 24 views
1

美好的一天!有人可以帮助我如何将这个SQL语句转换为LINQ?我正在使用Telerik数据访问。使用DataAccess在C#中将SQL语句转换为LINQ(TELERIK OPEN ACCESS ORM)

谢谢。

SELECT pay.Cutoff, 
     emp.Id, 
     emp.LastName, 
     job.Rate * 25 AS FixBIR, 

     (SELECT COUNT(*) AS MonthsWorked 
     FROM payroll AS pay3 
     WHERE YEAR(pay3.DateGenerated) = 2014 
      AND pay3.EmployeeId = 1 
      AND pay3.Cutoff = 1 
     ORDER BY MONTH(pay3.DateGenerated) ASC) * (job.Rate * 25) 
     AS MonthsWorked_FixBIR_TODATE 

FROM employee AS emp 
INNER JOIN payroll AS pay 
ON emp.Id = pay.EmployeeId 
INNER JOIN job 
ON emp.JobId = job.Id 
WHERE pay.Cutoff = 1 
AND pay.PayrollMonth = 'August' 
AND Year(pay.DateGenerated) = 2014 

回答

4

下面是答案:)

EntitiesModel model = new EntitiesModel(); 

var rolls = from pay in model.Payrolls 
      where pay.Cutoff == 1 && pay.PayrollMonth == "August" && pay.DateGenerated.year == 2014 
      select new 
      { 
       cutoff= pay.Cutoff, 
       lname = pay.Employee.LastName,  
       fixBir= pay.Employee.Job.Rate * 25, 

       MonthsWorked_FixBIR_TODATE = (from pay2 in model.Payrolls 
           where pay2.DateGenerated.Year == int.Parse(yearField.Text) 
           && pay2.EmployeeId == pay.EmployeeId && pay2.Cutoff == 1 
           select pay2).Count() * (pay.Employee.Job.Rate * 25) 
      }; 

下面是使用结果的查询代码。

foreach (var r in rolls) 
{ 
    Debug.WriteLine("Cutoff: "+r.cutoff); 
    Debug.WriteLine("Lastname: "+r.lname); 
    Debug.WriteLine("Fix BIR rate: "+r.fixBir); 
    Debug.WriteLine("Fix BIR to date: "+r.MonthsWorked_FixBIR_TODATE); 
} 
+0

你回答了你自己的问题。这就是你的“SIRA ULO”! – MyXEDNotes 2014-10-28 03:07:06

+1

你对@MyXEDNotes非常正确。我知道这个人真的有点疯狂,但LINQ看起来不错。 – 2014-10-28 03:09:06

6

我已经看到了这个现有thread这里stackoverflow.com这是导致LINQPadLinqer这是一个快速而有效的方式SQL查询转换为LINQ语法。

但是作为一个例子:

SQL:

select DeliveryNote.DeliveryNoteNumber, COUNT(Distinct(SalesOrderLine.ProductID)), Sum(DeliveryNoteLine.Quantity) 
from 
SalesOrder 
inner join SalesOrderLine on SalesOrderLine.SalesOrderID = SalesOrder.ID and SalesOrder.IsLatestRevision = 1 
inner join DeliveryNoteLine on DeliveryNoteLine.SalesOrderLineRootID = SalesOrderLine.RootID 
inner join DeliveryNote on DeliveryNote.ID = DeliveryNoteLine.DeliveryNoteID and DeliveryNote.IsLatestRevision = 1 
group by 
DeliveryNoteNumber 
order by 
DeliveryNoteNumber 

LINQ:

var query = 
from so in SalesOrders 
join sol in SalesOrderLines on so.ID equals sol.SalesOrderID 
join dnl in DeliveryNoteLines on sol.RootID equals dnl.SalesOrderLineRootID 
join dn in DeliveryNotes on dnl.DeliveryNoteID equals dn.ID 
where so.IsLatestRevision == 1 && dn.IsLatestRevision == 1 
group new { 
dn.DeliveryNoteNumber 
, dnl.Quantity } by dn.DeliveryNoteNumber into g 
orderby g.Key 
select new 
{ 
    DeliveryNoteNumber = g.Key, 
    ProductCount = (
     from sol1 in SalesOrderLines 
     join dnl1 in DeliveryNoteLines on sol1.RootID equals dnl1.SalesOrderLineRootID 
     where dnl1.DeliveryNote.DeliveryNoteNumber == g.Key 
     select sol1.ProductID 
    ).Distinct().Count() 
    , 
    QuantitySum = g.Sum(x => x.Quantity) 
}; 
+0

我认为这个答案会适合更多。 – 2015-11-19 05:22:52