2013-05-10 62 views
0

我想構建我的代碼,並能夠更好地維護我的一些LINQ查詢。實際上,我創建了一個具有某些功能的新助手類,但我在執行另一個IQueryable函數中的某些功能時遇到了一些問題。Linq2Sql IQueryable在另一個IQueryable內

當我執行SupplierMappings.GetSupplierAssociatedRT(int supplierID),我發現了以下錯誤的功能:

Method 'System.Linq.IQueryable`1[VMPortal.DataAccessLayer.CostCentre]
GetSupplierAssociatedCCPerRT(Int32, Int32)' has no supported translation to SQL.

我做錯了嗎?下面是相關代碼的一部分:

public class SupplierMappings 
{ 
    private static DataLayer dl = DataLayer.GetDataContext(); 

    public static IQueryable<ResourceType> GetSupplierAvailableRT(int supplierID) 
    { 
     return dl.ResourceTypes.Where(x => 
      dl.SuppliersCompanies2.Any(y => y.SupplierID == supplierID 
       && y.ResourceTypeID == x.ResourceTypeID 
       && y.StatusID == (short)SuppliersCompaniesStatusEnum.Active)); 
    } 

    public static IQueryable<ResourceType> GetSupplierAssociatedRT(int supplierID) 
    { 
     return GetSupplierAvailableRT(supplierID).Where(x => 
      // Check if we have at least one CC associated with that RT 
      GetSupplierAssociatedCCPerRT(supplierID, x.ResourceTypeID).Count() >= 1); 
    } 

    public static IQueryable<CostCentre> GetSupplierAvailableCCPerRT(int supplierID, int rtID) 
    { 
     return dl.CostCentres.Where(x => x.StatusID == (short)CostCentersStatusEnum.Active 
      // Check than the supplier is mapped at supplier level at same company & RT 
      && dl.SuppliersCompanies2.Any(y => y.CompanyID == x.CompanyID 
       && y.SupplierID == supplierID 
       && y.ResourceTypeID == rtID 
       && y.StatusID == (short)SuppliersCompaniesStatusEnum.Active) 
      // Check than the PA is active 
      && x.DeliveryGroup.StatusID == (short)DeliveryGroupsStatusEnum.Active); 
    } 

    public static IQueryable<CostCentre> GetSupplierAssociatedCCPerRT(int supplierID, int rtID) 
    { 
     return GetSupplierAvailableCCPerRT(supplierID, rtID).Where(x => 
      dl.SuppliersCostCentre2.Count(y => y.SupplierID == supplierID 
       && y.StatusID == (short)SuppliersCostCentreStatusEnum.Inactive 
       && y.ResourceTypeID == rtID) != dl.SuppliersCompanies2.Count(y => y.SupplierID == supplierID 
        && x.CompanyID == y.CompanyID 
        && y.StatusID == (short)SuppliersCompaniesStatusEnum.Active 
        && y.ResourceTypeID == rtID) 
      && dl.SuppliersPracticeAreas.Count(y => y.SupplierID == supplierID 
       && y.StatusID == (short)SuppliersPracticeAreaStatusEnum.Inactive 
       && y.ResourceTypeID == rtID) != dl.SuppliersCompanies2.Count(y => y.SupplierID == supplierID 
        && x.CompanyID == y.CompanyID 
        && y.StatusID == (short)SuppliersCompaniesStatusEnum.Active 
        && y.ResourceTypeID == rtID)); 
    } 
} 

回答

0

這是可惜的,但在LINQ到SQL你不能使用你定義的方法,返回除表達式以外的任何東西。並且可以轉換爲sql查詢的表達式數量有限(該轉換在linqtosql庫中定義)。所以你不能做你想做的事情。 你可以嘗試內聯你的功能。