- ASP.NET 4.5.2
- MVC 5
- 身份2.2
我能夠做SQL語句,因爲我很熟悉SQL,但是我對整個LINQ Lambda事物比較陌生。
我也研究過這個工作中最經常引用的兩個工具,但很抱歉 - Linqer無法運行,因爲它用於創建SQL連接的Microsoft工具(dbml文件)拒絕安裝在我的Win8上.1系統,並且LinqPad在實際購買產品之前不會提供實際的翻譯(這使得「試用」從根本上被打破,恕我直言:您怎麼可能評估阻止您執行您的操作正在評估?)。
我希望有人能拿下我的SQL語句,並將其轉換爲適當的LINQ Lambda表達式,我可以更有效地將其插入到我的控制器中。這也將成爲多模型顯示的一部分,這樣多個lambda表達式將被整理成一個顯示多個輸出的模型(非常相似但輸出略有不同,一個用戶只顯示用戶的儀表板,一個用於除管理儀表板之外還需要用戶儀表板的經理)。
我的表達是這樣的:
SELECT
co.CompanyId
, co.CompanyName
, co.CompanyCity
, co.NumberOfEmployees
, co.ProspectingScore
, po.ProvinceAbbr
, cd.PDFResourceLibrary
, cd.PresentationDone
, cd.MOUDone
FROM Company AS co
LEFT JOIN Province AS po ON co.ProvinceId = po.ProvinceId
OUTER APPLY (SELECT TOP 1 MAX(CycleDate) AS CycleDate, PDFResourceLibrary, PresentationDone, MOUDone FROM Cycle AS cy (NOLOCK) WHERE cy.CompanyId = co.CompanyId GROUP BY PDFResourceLibrary, PresentationDone, MOUDone) AS cd
WHERE co.RegionId = '66BD50DD-B6CB-E511-8265-14FEB5FBEAE8'
ORDER BY co.ProspectingScore DESC
爲了簡便起見,所述po.ProvinceAbbr及其相關聯的左連接可以被丟棄,則RegionID將通過從如權利要求拉到變量帶進來,並如果需要的話,除了Outer Apply的MAX要求(每個公司有多個週期,我只想按日期返回最近的週期)之外,您可以對所有表使用通配符(*)而不是命名字段。您在上面看到的是爲了填充前端而需要拉出的絕對最少數量的項目。
我在我的模型命名空間創建了合適的型號:
public class HomeViewModel {
public IEnumerable<DashboardUserData> RegionalCompanies { get; set; }
public IEnumerable<Company> AllOtherCompanies { get; set; }
}
public class DashboardUserData {
public Guid CompanyId { get; set; }
public string CompanyName { get; set; }
public string CompanyCity { get; set; }
public string ProvinceAbbr { get; set; }
public int? NumberOfEmployees { get; set; }
public int? ProspectingScore { get; set; }
public bool? PDFResourceLibrary { get; set; }
public bool? PresentationDone { get; set; }
public bool? MOUDone { get; set; }
}
,我希望lambda表達式附加到RegionalCompanies如圖所示的模型。
作爲一個例子,AllOtherCompanies(這是管理儀表板)具有與如下原來的lambda表達式:
viewModel.AllOtherCompanies = await db.Company.Where(c => c.RegionId != regionId).Include(c => c.Province).ToListAsync();
所以你可以看到,我至少有一半 - 我能引入公司表格,但我不知道如何爲每個公司包含週期表,以便只有最近的週期包含在公司中,並且所有其他公司都被刪除。
坦率地說,對於lambda,我仍然不確定如何連接Cycle表,以便只選擇最近的週期(按日期)。任何公司的所有其他週期都必須被忽略和放棄,所以從我可以告訴既沒有明確的Join也沒有GroupJoin在這裏是有效的。
對此提出建議?
當你有這樣的問題時,包含EF版本和涉及的實體類(以及它們的配置,如果有的話)而不是查看諸如'asp.net','mvc'和視圖模型之類的相關東西更重要。那麼你可以包含這些信息嗎? –
我的歉意。這個項目使用了最新的一切,只是沒有出血(如ASP.NET 5和MVC 7)。因此,我正在使用實體框架6.不幸的是,我不會在星期一回到工作中,所以我不確定你要求的其他內容,但是再次說明:假設最新的穩定但沒有出現邊緣。 –
我的意思是實體類我的朋友 - 公司,省和週期,所以我們可以玩LINQ查詢 –