在控制器的 linq 查询中缺少强制转换

Missing a cast in a linq query for a controller

我是 c# 控制器的新手,我正在尝试使用 LINQ 查询连接两个实体。但是我收到一条 'missing a cast' 错误消息,如下所示,我不明白它并不能帮助我更正错误。

控制器看起来像:

    public class SoonDueReportsController_simple : BaseODataController
{
    public SoonDueReportsController_simple(IUnitOfWork unitOfWork)
    {
        UnitOfWork = unitOfWork;
    }

    [Queryable(AllowedQueryOptions = AllowedQueryOptions.All)]
    public SoonDueReportsController_simple Get()
    {

        var falligkeiten = UnitOfWork.GetAll<Fälligkeiten>();
        var betriebe = UnitOfWork.GetAll<Betriebe>();

        var query = (from betrieb in betriebe.AsQueryable()
                    join fallig in falligkeiten.AsQueryable()
                    on betrieb.ID equals
                    fallig.Betrieb_ID
                    where fallig.Fälligkeit_Erledigt_Datum == null
                    && betrieb.Aktiv == true
                    select new
                    {
                        BetriebId = betrieb.ID,
                        FalligkeitObject = fallig.Fälligkeit_Objekt
                    });
        return query;
    }
}

这种类型的控制器我已成功用于单个实体(来自 sql 数据库的表)以在 kendo 网格中显示静态数据。但是当我尝试连接两个表时失败,如上所示。如果有人可以帮助我解决这个问题,我将不胜感激。 此致,马努

你select一个匿名对象的集合

select new
{
    BetriebId = betrieb.ID,
    FalligkeitObject = fallig.Fälligkeit_Objekt
});

并希望方法 return 某个类型的实例。 C# 是没有类型推断的强类型语言,这意味着如果你想 return 它们,你必须专门创建特定类型或接口的对象。

另外,您可以从 Get 方法中 return 编辑控制器类型本身。这是没有意义的。我实际上不知道你想做什么,但也许这会起作用:

public class SoonDueReportsController_simple : BaseODataController
{
    public SoonDueReportsController_simple(IUnitOfWork unitOfWork)
    {
        UnitOfWork = unitOfWork;
    }

    [Queryable(AllowedQueryOptions = AllowedQueryOptions.All)]
    public IQueryable<SomeModel> Get()
    {
        var falligkeiten = UnitOfWork.GetAll<Fälligkeiten>();
        var betriebe = UnitOfWork.GetAll<Betriebe>();

        var query = (from betrieb in betriebe.AsQueryable()
                    join fallig in falligkeiten.AsQueryable()
                    on betrieb.ID equals
                    fallig.Betrieb_ID
                    where fallig.Fälligkeit_Erledigt_Datum == null
                    && betrieb.Aktiv == true
                    select new SomeModel
                    {
                        BetriebId = betrieb.ID,
                        FalligkeitObject = fallig.Fälligkeit_Objekt
                    });
        return query;
    }
}

public class SomeModel 
{
    public int BetriebId { get; set; }
    public string FalligkeitObject { get; set; }
}

请记住,没有 "C# controllers" 这样的东西。您正在使用 OData,因此我建议您查看一些 OData 资源,那里有很多示例。

最后一件事,请不要误会我的意思,但这无助于提供属性、类型和其他标识符的德语名称。人们很难理解您的代码。

异常准确地向您解释了问题。您想要 return 一种 'SoonDueReportsController_simple' 类型,但您正在 returning 一个 Queryable,其中 a' 是您的新 { ..., ... } 对象。

我喜欢创建强类型对象并填充它的建议,但您也可以 return 动态类型。

这段代码的作用是解释:

private dynamic Get() => new { Name = "SomeName", Age = 31 };

private void TestGet()
{
   var obj = Get();
   var name = obj.Name;
   var age = obj.Age;
}