【问题标题】:VB Linq to C# covertion error "The name 'Model' does not exist in the current context"VB Linq to C# 转换错误“当前上下文中不存在名称‘模型’”
【发布时间】:2015-09-23 21:25:43
【问题描述】:

我有一个程序要从 VB 转换为 C#,并且在 Linq 语句中出现“当前上下文中不存在名称‘模型’”的错误。 “模型”列是“rdfcounts”表中的行标题,因此它确实存在。如何在 select 语句中调用实际的列?

var ACFTModel = (
    from rdfcounts in dc.RDFCounts
    where (Convert.ToString(rdfcounts.RDate.Value.Year) + Convert.ToString(rdfcounts.RDate.Value.Month)) == (RDFDate1.ToString())
    group rdfcounts by rdfcounts.Model into g
          select new { MonRDF = (RDFMDate.ToString() + " " + Model = g.Key + "" + Convert.ToString(g.Sum((p) => p.RDFNUm))) }).ToArray();

这是 Linq VB 代码,它确实有效。

   Dim ACFTModel = (From rdfcounts In dc.RDFCounts _
                Where (CStr(rdfcounts.RDate.Value.Year) _
                + CStr(rdfcounts.RDate.Value.Month)) = (RDFDate1.ToString) _
                        Group rdfcounts By rdfcounts.Model Into g = Group _
                        Select _
                        MonRDF = (RDFMDate.ToString + " " + Model + "" _
                        + CStr(g.Sum(Function(p) p.RDFNUm))) _
                        ).ToArray

【问题讨论】:

  • 选择部分中+ Model = g.Key 后面的= 是什么?
  • VB 中的字符串连接是使用& 运算符而不是+ 完成的。
  • 嗨,Ryan,我不确定“=”是什么意思,我是 C# 新手,使用 VB 到 C# 转换器,这就是被翻译成的内容。
  • 将“Model = g.Key”替换为“g.Key”。这是我们的转换器中的一个错误 - 它已在下一个版本中修复。
  • @OneFineDay: 使用 '&' 运算符更合适地进行连接,但 '+' 也可以,尽管它可能不明确。基本上,VB 选择对“+”最有意义的操作,可能是加法或连接。旧版 VB 读心功能的一部分。

标签: c# vb.net linq


【解决方案1】:

所以,问题是这样的:

group rdfcounts by rdfcounts.Model into g

您按Model 列分组到g 组中

这为您提供了一个分组集合,每个组的键都设置为值rdfcounts.Model。从本质上讲,这意味着 Model 现在位于您选择的 g.Key 下。

看起来你几乎已经完成了,除了你试图做一个进一步的过滤Model = g.Key(注意 C# 相等是==,而不是=)。这保证是正确的,因为您只是按模型分组(假设 Model 仍然可以访问)。

长话短说,将Model = g.Key 替换为g.Key

【讨论】:

  • 我已从 select 语句中删除了“模型”标识符并清除了错误。但我知道在“where”子句上有一个新的错误“表达式树可能不包含动态操作”。我认为由于它被声明为“Foreach(RDFDate 中的动态 RDFDate1)”,这可能会导致错误。有任何想法吗? (代码在下一条评论中)
  • foreach(RDMFDate 中的动态 RDFDate1){ MAppointment apt1 = new MAppointment(); var strOriginal = RDFDate1.Substring(4) + "/" + RDFDate1.Substring(4) + "/" + RDFDate1.Substring(0, 4); DateTime dt = DateTime.Parse(strOriginal); apt1.StartTime = dt; var ACFTModel = ( from rdfcounts in dc.RDFCounts where (Convert.ToString(rdfcounts.RDate.Value.Year) + Convert.ToString(rdfcounts.RDate.Value.Month)) == (RDFDate1.ToString()) 将 rdfcounts 分组rdfcounts.Model 成 g
【解决方案2】:

我能够更改代码所针对的先前数组的数据类型。不能正常工作。

            RDFCountDataContext dc = new RDFCountDataContext();
        object[] ModelArray = null;
        int aptID = 0;
        aptID = 0;

        Array RDFMDate = ((
            from rdfcounts in dc.RDFCounts
            select new {Expr1 = (Convert.ToString(rdfcounts.RDate.Value.Year) + Convert.ToString(rdfcounts.RDate.Value.Month))}).Distinct()).ToArray();

//INSTANT C# 注意:注释此声明,因为“foreach”循环中的循环变量是在 C# 的“foreach”标头中声明的:

        foreach (String RDFDate1 in RDFMDate)
        {

            MAppointment apt1 = new MAppointment();
            //var strOriginal = RDFDate1.Substring(4) + "/" + RDFDate1.Substring(4) + "/" + RDFDate1.Substring(0, 4);
            var strOriginal = RDFDate1.Substring(4) + "/" + RDFDate1.Substring(4) + "/" + RDFDate1.Substring(0, 4);
            DateTime dt = DateTime.Parse(strOriginal);

            apt1.StartTime = dt;

            var ACFTModel = (
                from rdfcounts in dc.RDFCounts
                where (Convert.ToString(rdfcounts.RDate.Value.Year) + Convert.ToString(rdfcounts.RDate.Value.Month)) == (RDFDate1.ToString())
                group rdfcounts by rdfcounts.Model into g
                //select new { MonRDF = (RDFMDate.ToString() + " " + Model = g.Key + "" + Convert.ToString(g.Sum((p) => p.RDFNUm))) }).ToArray();
                select new { MonRDF = (RDFMDate.ToString() + " " + g.Key + "" + Convert.ToString(g.Sum((p) => p.RDFNUm))) }).ToArray();


            ModelArray = ACFTModel;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-01
    • 2010-12-17
    相关资源
    最近更新 更多