2017-08-07 53 views
0

我已經做了動態LINQ表達類似下面如何設置爲加入IQueryable的<T> LINQ表達

private static List<Employee> FilterData(
    IQueryable<system> systemData, 
    IQueryable<employee> employeeData) 
{ 
    var filterData = systemData.Join(
     employeeData, 
     s => s.id, em => em.system_id, 
     (systemEntity, employeeEntity) => new { employee = employeeEntity}); 
} 

如何做以下聯接,當我使用通用的加入? 如何實現S => s.id,EM => em.system_id

private static List<TEntity> FilterData(
    IQueryable<T> systemData, 
    IQueryable<TEntity> employeeData) 
{ 
    //var filterData = systemData.Join(
    // employeeData, 
    // s => s.id, em => em.system_id, 
    // (systemEntity, employeeEntity) => new { employee = employeeEntity}); 
} 
+0

提供T和TEntity是FilterData的類型參數,您需要增加通用公司nstraints,以便它們基於具有id(用於系統)和system_id(用於員工)定義的類型 –

+0

使用IQueryable 編譯器知道來自systemData的屬性...使用IQueryable 編譯器不能知道T具有Property id或system_id – Noren

+0

可能的解決方案是什麼? – Neo

回答

2

您可以添加通用約束你的方法:

public interface ISystem 
{ 
    int id { get; } 
    ... 
} 

public interface IEmployee 
{ 
    ... 
    int system_id { get; } 
    ... 
} 

private static List<TEmployee> FilterData<TSystem, TEmployee>(
    IQueryable<TSystem> systemData, IQueryable<TEmployee> employeeData) 
    where TSystem : ISystem 
    where TEmployee: IEmployee 
{ 
    var filterData = 
     systemData.Join(employeeData, 
         s => s.id, 
         em => em.system_id, 
         (systemEntity, employeeEntity) => new { employee = employeeEntity}); 
} 

注意,它看起來像你只關心讓員工使用現有的system_id,如果是這種情況,Join可能是矯枉過正的(如果您從系統中提取屬性,則不會這麼做)

+0

嘿謝謝,我用直接模型類而不是接口? like where TSystem:SystemTable 其中TEmployee:EmployeeTable – Neo

+0

@Neo您可以使用基類或接口 –

相關問題