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

时间:2017-01-28 20:43:40

标签: c# asp.net-mvc entity-framework linq-to-entities

我是c#controllers的新手,我正在尝试使用LINQ查询连接两个实体。但是我收到了一条“丢失的演员”错误消息,如下所示,我不明白,它无法帮助我纠正错误。 enter image description here

控制器看起来像:

    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 db的表)以在kendo网格中显示静态数据。但是当我尝试加入如上所示的两个表时,我失败了。如果有人可以帮我解决这个问题,我会非常感激。 此致,Manu

2 个答案:

答案 0 :(得分:2)

您选择一组匿名对象

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

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

此外,您要从Get方法返回控制器类型本身。这毫无意义。我实际上不知道你想做什么,但可能会这样做:

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#控制器”之类的东西。你正在使用OData,所以我建议你看看一些OData资源,那里有很多例子。

最后一件事,不要误会我的意思,但它没有帮助给出属性,类型和其他标识符德语名称。人们很难尝试理解你的代码。

答案 1 :(得分:1)

该例外确切地向您解释了问题。您想要返回一种类型的SoonDueReportsController_simple&#39;但是你要返回一个Queryable,其中一个&#39;是你的新{...,...}对象。

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

此代码可用于解释:

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

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