将SQL查询Case语句重写为linq

时间:2017-04-27 14:25:07

标签: c# sql linq case inner-join

我想知道是否有可能将case语句重写为linq。这是MSSQL查询

 SELECT a.[RegionName],a.[AreaName],a.[BranchName],a.[DistrictNumber],a.[DistributionScheme],e.[PublicationCode],c.[ComplaintKindCode],d.[ComplaintKindCaption],c.[RegistrationDate], DATENAME(DW,c.[RegistrationDate]) AS TheDayName, c.[SubscriberName], c.[Street], c.[AddressNumber]

FROM [Dino].[dbo].[Address] ac

INNER JOIN [Dino].[dbo].[AddressRoute] b ON b.[AddressNumber] = ac.[AddressNumber] AND ((b.[HouseholdNumber] IS NULL AND ac.[HouseholdNumber] IS NULL) OR (b.[HouseholdNumber] = ac.[HouseholdNumber]))

INNER JOIN [Dino].[dbo].[ComplaintHistory] c ON c.AddressNumber = b.AddressNumber

INNER JOIN [Dino].[dbo].[DistrictBranchAreaRegion] a ON b.[DistrictId] = a.[DistrictId]

INNER JOIN [Dino].[dbo].[ComplaintKind] d ON c.[ComplaintKindCode] = d.[ComplaintKindCode]

INNER JOIN [Dino].[dbo].[Publication] e ON c.[ProductNumber] = e.[ProductNumber]

INNER JOIN [Dino].[dbo].[District] f ON a.[DistrictNumber] = CASE WHEN DATENAME(DW, c.RegistrationDate) = 'Monday' THEN ac.M1 
WHEN DATENAME(DW, c.RegistrationDate) = 'Tuesday' THEN ac.M2 WHEN DATENAME(DW, c.RegistrationDate) = 'Wednesday' THEN ac.M3 WHEN DATENAME(DW, c.RegistrationDate) = 'Thursday' THEN ac.M4 WHEN DATENAME(DW, c.RegistrationDate) = 'Friday' THEN ac.M5 WHEN DATENAME(DW, c.RegistrationDate) = 'Saturday' THEN ac.M6 WHEN DATENAME(DW, c.RegistrationDate) = 'Sunday' THEN ac.M7 END

WHERE c.[RegistrationDate] >= '2016-06-19' AND c.[RegistrationDate] <= '2016-06-19'

GROUP BY a.[RegionName], a.[AreaName], a.[BranchName], a.[DistrictNumber], a.[DistributionScheme], e.PublicationCode, c.ComplaintKindCode, d.ComplaintKindCaption, c.RegistrationDate, c.SubscriberName, c.Street, c.AddressNumber

这就是我到目前为止在linq to sql中我需要弄清楚如何将case语句放入其中。

public IQueryable<ResultStatistics> GetComplaints(string areaname = null, string branch = null, string titlecondition = null, string complaintkindcode = null, DateTime? fromdate = null, DateTime? todate = null, string fromdistrict = null, string todistrict = null)
        {

            DateTime fromDate = Convert.ToDateTime(fromdate);
            DateTime toDate = Convert.ToDateTime(todate);

        IQueryable<ResultStatistics> query =
                                                  (from ac in db.Addresses
                                                   join b in db.AddressRoute
                                                   on new { ac.AddressNumber, ac.HouseholdNumber }
                                                   equals new { b.AddressNumber, b.HouseholdNumber }
                                                   join c in db.Complaint on b.AddressNumber equals c.AddressNumber
                                                   join a in db.DistrictBranchAreaRegion on b.DistrictId equals a.DistrictId
                                                   join d in db.ComplaintKind on c.ComplaintKindCode equals d.ComplaintKindCode
                                                   join e in db.Publication on c.ProductNumber equals e.ProductNumber


                                                   group new { a, e, c, d } by new
                                                   {
                                                       a.RegionName,
                                                       a.AreaName,
                                                       a.BranchName,
                                                       a.DistrictNumber,
                                                       a.DistributionScheme,
                                                       e.PublicationCode,
                                                       c.ComplaintKindCode,
                                                       d.ComplaintKindCaption,
                                                       c.RegistrationDate,
                                                       c.SubscriberName,
                                                       c.Street,
                                                       c.StreetNumber,
                                                       c.Message
                                                   } into g
                                                   select new ResultStatistics()
                                                   {
                                                       RegionName = g.Key.RegionName,
                                                       AreaName = g.Key.AreaName,
                                                       BranchName = g.Key.BranchName,
                                                       DistrictNumber = g.Key.DistrictNumber,
                                                       DistributionScheme = g.Key.DistributionScheme,
                                                       PublicationCode = g.Key.PublicationCode,
                                                       ComplaintKindCode = g.Key.ComplaintKindCode,
                                                       ComplaintKindCaption = g.Key.ComplaintKindCaption,
                                                       RegistrationDate = g.Key.RegistrationDate,
                                                       SubscriberName = g.Key.SubscriberName,
                                                       Street = g.Key.Street,
                                                       StreetNumber = g.Key.StreetNumber,
                                                       Message = g.Key.Message
                                                   }).AsQueryable();

        query = query.Where(q => q.RegistrationDate >= fromDate && q.RegistrationDate <= toDate);

        if (!String.IsNullOrWhiteSpace(fromdistrict) && (!String.IsNullOrWhiteSpace(todistrict)))
        {
            var FromDistrict = Convert.ToInt32(fromdistrict);
            var ToDistrict = Convert.ToInt32(todistrict);

            query = query.Where(q => q.DistrictNumber >= FromDistrict && q.DistrictNumber <= ToDistrict);
        }


        if (!String.IsNullOrWhiteSpace(areaname))
        {
            query = query.Where(q =>
                areaname.Contains(q.AreaName));
        }

        if (!String.IsNullOrWhiteSpace(titlecondition))
        {
            query = query.Where(q =>
                titlecondition.Contains(q.PublicationCode));
        }

        if (!String.IsNullOrWhiteSpace(branch))
        {
            query = query.Where(q =>
                branch.Contains(q.BranchName));
        }

        if (!String.IsNullOrWhiteSpace(complaintkindcode))
        {
            query = query.Where(q =>
                complaintkindcode.Contains(q.ComplaintKindCode));
        }

        return query;

    }

很高兴有一些见解和提示,谢谢!

0 个答案:

没有答案