C# 如何为IQueryable设置联接<;T>;linq表达式

C# 如何为IQueryable设置联接<;T>;linq表达式,c#,linq,C#,Linq,我已经完成了动态linq表达式,如下所示 private static List<Employee> FilterData( IQueryable<system> systemData, IQueryable<employee> employeeData) { var filterData = systemData.Join( employeeData, s => s.id, em => e

我已经完成了动态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});
}
私有静态列表过滤器数据(
IQueryable系统数据,
I可雇佣员工(数据)
{
var filterData=systemData.Join(
雇员数据,
s=>s.id,em=>em.system\u id,
(systemEntity,employeeEntity)=>new{employee=employeeEntity});
}
当我在连接中使用泛型时,如何执行下面的连接? 如何实现s=>s.id,em=>em.system\u id

私有静态列表过滤器数据(
IQueryable系统数据,
I可雇佣员工(数据)
{
//var filterData=systemData.Join(
//雇员数据,
//s=>s.id,em=>em.system\u id,
//(systemEntity,employeeEntity)=>new{employee=employeeEntity});
}

您可以向方法中添加常规约束:

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});
}
公共接口系统
{
int id{get;}
...
}
公共接口雇员
{
...
int system_id{get;}
...
}
私有静态列表筛选器数据(
IQueryable系统数据、IQueryable员工数据)
其中TSystem:ISystem
Temploye在哪里:我的雇员
{
变量filterData=
systemData.Join(员工数据、,
s=>s.id,
em=>em.system\u id,
(systemEntity,employeeEntity)=>new{employee=employeeEntity});
}

请注意,您似乎只对获取具有现有系统id的员工感兴趣,如果是这种情况,则联接可能会过度(如果从系统中提取属性,则不会)

您可以向方法添加通用约束:

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});
}
公共接口系统
{
int id{get;}
...
}
公共接口雇员
{
...
int system_id{get;}
...
}
私有静态列表筛选器数据(
IQueryable系统数据、IQueryable员工数据)
其中TSystem:ISystem
Temploye在哪里:我的雇员
{
变量filterData=
systemData.Join(员工数据、,
s=>s.id,
em=>em.system\u id,
(systemEntity,employeeEntity)=>new{employee=employeeEntity});
}

请注意,您似乎只对获取具有现有系统id的员工感兴趣,如果是这种情况,则联接可能会过度(如果从系统提取属性,则不会)

前提是T和tenty是FilterData的类型参数,您需要添加泛型约束,以便它们基于id(对于system)和system_id(对于employee)为IQueryable定义的类型编译器从systemData了解属性。。。使用IQueryable,编译器无法知道T具有属性id或system_id可能的解决方案是什么?您可以在泛型类型上添加要求它们具有这些属性的约束(通过接口或基类),或者必须将这些lambda作为表达式传递给方法。明白了,任何将lambdas作为表达式传递给方法的示例如果T和TEntity是FilterData的类型参数,则需要添加泛型约束,以便它们基于使用IQueryable定义的id(对于系统)和system_id(对于员工)的类型。编译器知道systemData的属性。。。使用IQueryable,编译器无法知道T具有属性id或system_id可能的解决方案是什么?您可以在泛型类型上添加要求它们具有这些属性的约束(通过接口或基类),或者必须将这些lambda作为表达式传递给方法。明白了,任何将lambdas作为表达式传递给方法的示例。谢谢,我使用直接模型类而不是接口怎么样?如where TSystem:SystemTable,其中TEmployee:EmployeeTable@Neo您可以使用基类或接口谢了,我用直接模型类代替接口怎么样?如where TSystem:SystemTable,其中TEmployee:EmployeeTable@Neo您可以使用基类或接口