2013-05-10 19 views
0

Я пытаюсь структурировать свой код и иметь возможность лучше поддерживать некоторые из моих запросов LINQ. На самом деле я создал новый вспомогательный класс с некоторыми функциями, но у меня возникли некоторые проблемы с выполнением некоторых из моих функций IQueryable внутри других функций 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). Поэтому вы не можете делать то, что вы пытаетесь сделать. Вы можете попробовать встроить свои функции.

Смежные вопросы