2016-02-26 32 views
0

統計:有困難試圖想出一個有效的LINQ lambda表達式

  • 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在這裏是有效的。

對此提出建議?

+0

當你有這樣的問題時,包含EF版本和涉及的實體類(以及它們的配置,如果有的話)而不是查看諸如'asp.net','mvc'和視圖模型之類的相關東西更重要。那麼你可以包含這些信息嗎? –

+0

我的歉意。這個項目使用了最新的一切,只是沒有出血(如ASP.NET 5和MVC 7)。因此,我正在使用實體框架6.不幸的是,我不會在星期一回到工作中,所以我不確定你要求的其他內容,但是再次說明:假設最新的穩定但沒有出現邊緣。 –

+0

我的意思是實體類我的朋友 - 公司,省和週期,所以我們可以玩LINQ查詢 –

回答

0

爲什麼不把它作爲SQL來運行?如:

var results = ctx.Companies.SqlQuery("SELECT ...", "66BD50DD-B6CB-E511-8265-14FEB5FBEAE8"); 

其中GUID作爲參數傳遞並將結果轉換爲公司。您需要在SQL中將其聲明爲@ p0。

+0

我已經這樣做了。它*技術上*有效。但是,我正在尋找純粹的解決方案,這將是一個lambda表達式。另外,使用lambda表達式,我可以對輸出進行任何排序和分頁,這比使用原始SQL語句要容易得多,主要是因爲我使用的分頁模塊(通過NuGet的PagedList)鉤入了lambda表達式。我不知道如何用原始SQL實現它。 –

+0

換句話說,我現在所擁有的僅僅是原始SQL,而我仍然需要實現排序,分頁和過濾。從我的角度來看,使用Lambda LINQ會讓事情變得更容易,因爲我用於排序,分頁和過濾的所有內容都已經使用了Lambda LINQ。 –