C# 显式变量声明

C# 显式变量声明,c#,entity-framework,syntax,variable-declaration,C#,Entity Framework,Syntax,Variable Declaration,我有一个隐式定义为var的局部变量,它由通过实体框架从数据库检索的对象填充。当我将鼠标悬停在变量上时,会得到下图所示的详细信息 例如,我如何在不使用var的情况下显式定义变量 IQuerable<{Inpection Ins, Field F}> tempInspInner = getInspections(); 更新 getInspections()具有以下代码: return _dbcontext.Inspection .Join(_dbc

我有一个隐式定义为
var
的局部变量,它由通过实体框架从数据库检索的对象填充。当我将鼠标悬停在变量上时,会得到下图所示的详细信息

例如,我如何在不使用var的情况下显式定义变量

IQuerable<{Inpection Ins, Field F}> tempInspInner =  getInspections();

更新

getInspections()具有以下代码:

return _dbcontext.Inspection
                .Join(_dbcontext.Field,
                ins => ins.FieldId,
                f => f.FieldId,
                (ins, f) => new { Ins = ins, F = f }).Where(*hidden*);

getInspections
返回一个匿名类型(meh sigh),名为tuples的类型没有帮助,但是您可以将其投影到类中

public class SomeObject 
{
    public Inpection Ins {get;set;}
    public Field F {get;set;}
}

IQueryable<SomeObject> = getInspections.Select(x => new SomeObject { Ins = x.Ins, F = x.F });
公共类SomeObject
{
公共输入Ins{get;set;}
公共字段F{get;set;}
}
IQueryable=getInspections.Select(x=>newsomeObject{Ins=x.Ins,F=x.F});

说到这里,您可能最好返回强类型的
IQueryable
无论如何

正如其他人所说,理想的选择是让
getInspections()
返回强类型集合

或者,您应该能够使用显式类型(使用)定义变量,如下所示:

IEnumerable<(Inspection Ins, Field F)> test = getInspections()
    .AsEnumerable()
    .Cast<dynamic>()
    .Select(x => (Ins: (Inspection)x.Ins, F: (Field)x.F));
IEnumerable test=getInspections()
.可计算的()
.Cast()
.选择(x=>(Ins:(检查)x.Ins,F:(字段)x.F));

这种方法的一个缺点是,由于结果被强制转换为
动态
,编译器将不知道所使用的源属性(
x.Ins
x.F
)是否发生了变化。因此,在运行时执行之前,您不会知道这是无效的。

i在GetInspections()中添加代码。这个答案适用吗?@pnizzle是的,它适用。如果
getInspections()
返回
IQueryable
,那么这仍然不适用,因为您不知道该方法返回的匿名类型的可用属性。我这样做了。但在重构代码后,我发现它是多余的(与您的答案无关)。我从中吸取了教训,今天是个好日子。@TheGeneral创建了新的SomeObject,其值为x,将加载getInspections()结果的对象,从而取消延迟加载(据我所知,这是实体框架的默认值)?
如何在不使用var的情况下显式定义变量,例如
如果它是匿名类型,则不能。您需要使用
var
。它是匿名的,因为您不能显式声明它的实例。您没有定义
类结果{public Inspection Ins{get;set;}公共字段{get;set;}}
的代码。编译器可以解决这个问题,并可能在后台创建类型,但它是匿名的。您可以创建自己的类型,其中包含要从查询中返回的字段,然后返回该类型的
IQueryable
(即
=>新结果{Ins=Ins,F=F}
问题是,我需要从getInspections()传递对象(让我们调用该检查)到另一个方法,该方法将迭代内容并创建新对象。如果我不指定检查内容的结构,则该方法将不知道如何通过select函数进行迭代。除非我在此处缺少某些内容。在我给出的示例中,如果需要将
测试
传递到另一个方法,则该方法的计数器必须定义为
IEnumerable
是否需要强制转换?
cast()
IEnumerable<(Inspection Ins, Field F)> test = getInspections()
    .AsEnumerable()
    .Cast<dynamic>()
    .Select(x => (Ins: (Inspection)x.Ins, F: (Field)x.F));