C# 基于(casted)接口的LINQ where子句

C# 基于(casted)接口的LINQ where子句,c#,asp.net-mvc,linq,entity-framework,linq-to-entities,C#,Asp.net Mvc,Linq,Entity Framework,Linq To Entities,我想筛选实现接口的实体列表 型号: public interface IEntity { int Id {get; set;} } public interface IOther { int Other {get; set;} } public class MyEntity : IEntity, IOther { public int Id {get; set;} public int Other {get; set;} } public abstract

我想筛选实现接口的实体列表

型号:

public interface IEntity
{
    int Id {get; set;}
}

public interface IOther
{
    int Other {get; set;}
}

public class MyEntity : IEntity, IOther
{
    public int Id {get; set;}
    public int Other {get; set;}
}
public abstract class GenericApiController<T> : ApiController
    where T : IEntity
{
    public HttpResponseMessage Get(int other)
    {
        var query = Repository.AsQueryable()
                              .Cast<IOther>()
                              .Where(x => x.Other == other);

        return Ok(query.ToList());
    }
}
控制器:

public interface IEntity
{
    int Id {get; set;}
}

public interface IOther
{
    int Other {get; set;}
}

public class MyEntity : IEntity, IOther
{
    public int Id {get; set;}
    public int Other {get; set;}
}
public abstract class GenericApiController<T> : ApiController
    where T : IEntity
{
    public HttpResponseMessage Get(int other)
    {
        var query = Repository.AsQueryable()
                              .Cast<IOther>()
                              .Where(x => x.Other == other);

        return Ok(query.ToList());
    }
}
请注意
Get()
上的额外约束,但据我所知,这是不可能的


有什么建议吗?

您是否尝试在IOther中实现IEnumerable接口

public interface IOther : IEnumerable
{
    int Other {get; set;}
}

您可以为继承
的类编写特定的控制器,但它不能完全解决问题

在下面的表达式中(
Repository
是一个
IQueryable
T
继承自
IOther
),C编译器考虑从
T
IOther
的隐式转换,以调用
其他
属性

var query = Repository.Where(x => x.Other == other);
因此,对于实体的强制转换和LINQ,您可以得到相同的
NotSupportedException

解决方案是在运行时使用反射构建查询

这是为了限制编译器在表达式级别的工作,并在运行时执行从表达式到函数的转换

通用查询表达式为:

Expression<Func<IQueryable<T>, int, IQueryable<T>>> QueryExpression =
    (repository, other) => repository.Where(x => x.Other == other);

您的模型将无法编译,因为MyEntity没有实现IOtherWhoops,已修复:)还有一些其他错误。这是一种伪代码。应该把消息传递过来。为什么不为另一个接口拥有另一个泛型??.A.NET。我认为这是最后一招,因为我不喜欢多个“BASIC”通用控制器。但这可能是唯一的选择way@AD.Net经过再三考虑,另一个通用控制器可能不像我最初认为的那样是一个糟糕的解决方案。我会试试看:)