【问题标题】:Explicit variable declaration显式变量声明
【发布时间】:2019-01-17 00:59:02
【问题描述】:

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

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

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

代替:

var tempInspInner =  getInspections();

更新

getInspections() 代码如下:

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

【问题讨论】:

  • How can I explicitly define my variable without using var, for example 如果是匿名类型,则不能。您需要使用var
  • 它是匿名的,因为您不能显式声明它的实例。您没有定义class Result { public Inspection Ins {get; set;} public Field F {get; set;} } 的代码。编译器可以弄清楚这一点,并可能在后台创建类型,但它是匿名的。您可以创建自己的类型,其中包含要从查询中返回的字段,然后返回 that 类型的 IQueryable(即 =&gt; new Result { Ins = ins, F = f }

标签: c# entity-framework syntax variable-declaration


【解决方案1】:

getInspections 返回一个匿名类型(meh sigh),命名元组不会有帮助,但是你可以将它投影到一个类中

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

说到这里,你最好还是返回一个强类型的IQueryable

【讨论】:

  • 我在 GetInspections() 中添加了代码。这个答案适用吗?
  • @pnizzle 是的
  • 仅供参考,如果 getInspections() 返回 IQueryable&lt;object&gt; 那么这仍然不起作用,因为您不知道从该方法返回的匿名类型的可用属性。
  • 我确实这样做了。但是在重构我的代码后,我最终发现它是多余的(与您的答案无关)。我已经从中受益,因此今天是美好的一天。
  • @TheGeneral 使用 x 的值创建新的 SomeObject,将加载 getInspections() 结果的对象,从而取消延迟加载(据我了解,默认情况下实体框架)?
【解决方案2】:

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

作为替代方案,您应该能够使用显式类型(使用named tuples)定义变量,如下所示:

IEnumerable<(Inspection Ins, Field F)> test = getInspections()
    .AsEnumerable()
    .Cast<dynamic>()
    .Select(x => (Ins: (Inspection)x.Ins, F: (Field)x.F));

这种方法的一个缺点是,由于结果被转换为dynamic,编译器将不知道正在使用的源属性(x.Insx.F)是否会发生变化。所以你不会知道这在运行时执行之前是行不通的。

【讨论】:

  • 问题是,我需要将对象从 getInspections() (让我们称之为检查)传递给另一个方法,该方法将遍历内容并创建新对象。如果我没有指定检查内容的结构,那么该方法将不知道如何通过 select 函数对其进行迭代。除非我在这里遗漏了什么。
  • 在我给出的示例中,如果您需要将test 传递给另一个方法,则该方法的参数只需定义为IEnumerable&lt;(Inspection Ins, Field F)&gt;
  • 演员阵容有必要吗? Cast&lt;dynamic&gt;() ?
猜你喜欢
  • 2013-07-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-07-23
  • 1970-01-01
相关资源
最近更新 更多