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));