2013-05-09 22 views
1

的恆定值,我不知道這有什麼錯此查詢 - 它不斷給我這個錯誤:錯誤LINQ到SQL:無法創建類型

Unable to create a constant value of type 'OvertimeProject.DataCore.tbl_Promotion'. Only primitive types or enumeration types are supported in this context.

這裏是我的LINQ語句:

public IEnumerable<StaffJoin> GetOrderStaffByDepartment(int DepID, DateTime DATE) 
{ 
    using (var Context = new CRMDBEntities()) 
    { 
     var result = (from pro2 in Context.tbl_Promotion 
         where pro2.PromotionDate <= DATE && pro2.DepID==DepID 
         select pro2).ToList(); 

     var result2 = (from Re in result 
         group Re by Re.StaffID into g2 
         join prop in Context.tbl_Promotion on g2.Max(c => c.PromotionID) equals prop.PromotionID 
         select prop).ToList(); 

     var result3 = (from s in Context.tbl_STaff 
         join 
         promotion in result2 on s.StaffID equals promotion.StaffID 
         join 
         position in Context.tbl_Position on promotion.PositionID equals position.PositionID 
         select new StaffJoin{Staff= s,Promotion= promotion,Position= position}).ToList(); 

     return result3; 
    } 
} 

這裏是我的課,我想,以填補與返回的數據:

public class StaffJoin 
{ 
    public tbl_STaff Staff { get; set; } 
    public tbl_Promotion Promotion { get; set; } 
    public tbl_Position Position { get; set; } 
} 

...這裏是我的導航模式instructure igated屬性:

tbl_Staff     tbl_Promotion     tbl_Position 
---------     --------------     ------------- 
StaffID 0.1    PromotionID    0.1 PositionID 
DepID      PromotionDate     PositionName 
StaffName     * StaffID      PositionBase 
Chek      PositionID *     Avaiilibilty 
          Avilibility 
-------     ---------------    -------------- 
Navigation    Navigation     Navigation 
----------    --------------    ---------------- 
tbl_Department    tbl_Position     tbl_Promotion 
tbl_Promotion    tbl_Staff 

我需要的是這樣的:

所有工作人員爲特定的部門,加上最大推廣特定日期後每一個工作人員,加上位置信息與促進

+1

我懷疑,你可以通過刪除'ToList()在'result'和''電話解決一切result2'。坦率地說,這不是必須的,你通過將LINQ與對象以及LINQ與實體混合在一起來使事情變得複雜。 – 2013-05-09 01:11:10

+0

我們對這篇文章所做的編輯量意味着我們真的不知道你在問什麼,而且你沒有很好地解釋自己。 – gunr2171 2013-05-09 01:24:35

+0

@JeffMercado我會更進一步與您的建議。我同意在這種情況下,'.ToList()'調用是問題。然而,考慮到'CRMDBEntities'的生命週期,我們真的想把最後一行改爲'return result3.ToList();否則你將得到一個與'CRMDBEntities'有關的異常已經被丟棄。 – Aron 2013-05-09 02:39:10

回答

2

您的問題是你的代碼基本上讀取這樣的...

public IEnumerable<StaffJoin> GetOrderStaffByDepartment(int DepID, DateTime DATE) 
{ 
    using (var Context = new CRMDBEntities()) 
    { 
     List<Promotion> result = (from pro2 in Context.tbl_Promotion 
           where pro2.PromotionDate <= DATE && pro2.DepID==DepID 
           select pro2).ToList(); 

     List<Promotion> result2 = (from Re in result 
           group Re by Re.StaffID into g2 
           join prop in Context.tbl_Promotion on g2.Max(c => c.PromotionID) equals prop.PromotionID 
           select prop).ToList(); 

     var result3 = (from s in Context.tbl_STaff 
        join 
        promotion in result2 on s.StaffID equals promotion.StaffID 
        join 
        position in Context.tbl_Position on promotion.PositionID equals position.PositionID 
        select new StaffJoin{Staff= s,Promotion= promotion,Position= position}).ToList(); 

     return result3; 
    } 
} 

現在在result3,你想放兩個List<Propmotion>成一個Linq查詢,LinqToSQL需要將其轉換爲SQL。很明顯,SQL無法處理.net用戶類,因此失敗。

如果您認爲傑夫的變化,你會得到

public IEnumerable<StaffJoin> GetOrderStaffByDepartment(int DepID, DateTime DATE) 
{ 
    using (var Context = new CRMDBEntities()) 
    { 
     IQueryable<Promotion> result = (from pro2 in Context.tbl_Promotion 
           where pro2.PromotionDate <= DATE && pro2.DepID==DepID 
           select pro2); 

     IQueryable<Promotion> result2 = (from Re in result 
           group Re by Re.StaffID into g2 
           join prop in Context.tbl_Promotion on g2.Max(c => c.PromotionID) equals prop.PromotionID 
           select prop); 

     var result3 = (from s in Context.tbl_STaff 
        join 
        promotion in result2 on s.StaffID equals promotion.StaffID 
        join 
        position in Context.tbl_Position on promotion.PositionID equals position.PositionID 
        select new StaffJoin{Staff= s,Promotion= promotion,Position= position}).ToList(); 

     return result3; 
    } 
} 

現在,LinqToSQL知道如何處理IQueryables。它可以將result和result2中的SQL內聯爲子查詢。因此有所不同。

但是最後一條你需要改變的是最後一行。 IQueryable<T>代表一個查詢,尚未發生的工作。當您調用.GetEnumerator()時,查詢實際上運行。但是,這隻會出現在消費代碼中,這時CRMDBEntities將被處置。 SOOOO .....

public IEnumerable<StaffJoin> GetOrderStaffByDepartment(int DepID, DateTime DATE) 
{ 
    using (var Context = new CRMDBEntities()) 
    { 
     IQueryable<Promotion> result = (from pro2 in Context.tbl_Promotion 
           where pro2.PromotionDate <= DATE && pro2.DepID==DepID 
           select pro2); 

     IQueryable<Promotion> result2 = (from Re in result 
           group Re by Re.StaffID into g2 
           join prop in Context.tbl_Promotion on g2.Max(c => c.PromotionID) equals prop.PromotionID 
           select prop); 

     var result3 = (from s in Context.tbl_STaff 
        join 
        promotion in result2 on s.StaffID equals promotion.StaffID 
        join 
        position in Context.tbl_Position on promotion.PositionID equals position.PositionID 
        select new StaffJoin{Staff= s,Promotion= promotion,Position= position}).ToList(); 

     return result3.ToList(); 
    } 
} 

或者與var的背...

public IEnumerable<StaffJoin> GetOrderStaffByDepartment(int DepID, DateTime DATE) 
{ 
    using (var Context = new CRMDBEntities()) 
    { 
     var result = (from pro2 in Context.tbl_Promotion 
           where pro2.PromotionDate <= DATE && pro2.DepID==DepID 
           select pro2); 

     var result2 = (from Re in result 
           group Re by Re.StaffID into g2 
           join prop in Context.tbl_Promotion on g2.Max(c => c.PromotionID) equals prop.PromotionID 
           select prop); 

     var result3 = (from s in Context.tbl_STaff 
        join 
        promotion in result2 on s.StaffID equals promotion.StaffID 
        join 
        position in Context.tbl_Position on promotion.PositionID equals position.PositionID 
        select new StaffJoin{Staff= s,Promotion= promotion,Position= position}).ToList(); 

     return result3.ToList(); 
    } 
} 
+0

謝謝aloot的人,我工作後,我刪除ToList() – 2013-05-09 09:46:55

+0

最後的'ToList()'調用是不必要的。 'result3'已經是一個列表。 – 2013-05-12 02:01:15

+0

@JeffMercado所以它是... – Aron 2013-05-12 10:04:31

相關問題