我想知道是否有可能将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;
}
很高兴有一些见解和提示,谢谢!