【问题标题】:How can I pass a linq var datatype to a method? [duplicate]如何将 linq var 数据类型传递给方法? [复制]
【发布时间】:2011-09-26 09:23:21
【问题描述】:

可能重复:
How can I pass an anonymous type to a method?

我遇到了一个很严重的问题,希望你能帮我解决一下

有如下的linq-to-sql查询,很简单:

var i = from cr in db.ComprobanteRecepcions  join c in db.Comprobantes
on new { cr.RFC, cr.RFCProveedor, cr.Folio, cr.Serie }  equals new { c.RFC, c.RFCProveedor, c.Folio, c.Serie }
where
Convert.ToString(cr.IDSucursal) == "4" &&
cr.RFC == "FIN020938SVR "
select new { cr.Serie, cr.Folio, cr.IDStatusComp, c.FechaEmision, c.Comentarios, c.Total };

我想将 i 传递给一个方法,比如这样

mymethod void(var a)

当然不能这样做......并创建一个类型(类)来返回它,就像这样

select new MyType  {cr.Serie, cr.Folio, cr.IDStatusComp, c.FechaEmision, c.Comentarios, c.Total };

是不切实际的,例如返回 XElement 或 XDocument 那我还能做什么?我必须用 var i 变量填充数据网格,但我不知道如何获取这个变量,我也用谷歌搜索了答案,但没有一个简单的答案......

了解我是使用 c#、.net 和 MS 技术的新手(我是一名 Java 程序员)

【问题讨论】:

  • 你不能使用 mymethod void(object a) 吗?
  • 为什么声明类不切实际?它只需要包含您在匿名类中设置的所有属性名称的属性或成员变量。您可以模板化您的 mymethod,但如果您想按名称访问属性,则需要声明类或使用“动态”作为参数。
  • 为什么为此创建一个类是不切实际的?
  • 这是不切实际的,因为我必须进行 50 次这样的查询。使用一个类意味着我必须创建 50 个类,每个查询一个,这对我来说听起来像是很多工作......
  • @Nick Bradley,好吧,假设我能做到,我该如何拆箱变量?

标签: c# asp.net linq linq-to-sql datagrid


【解决方案1】:

返回这样的东西怎么样

public class MyType
{
    public ComprobanteRecepcions Recepcions { get;set; }
    public Comprobantes Comprobantes { get;set; }
}

在你的 linq 中:

select new MyType { Recepcions  = cr, Comprobantes = c }

【讨论】:

  • 哦,好吧,我必须创建一个类,这是我不想做的事情,我必须进行 50 次这样的查询。使用一个类意味着我必须创建 50 个类,每个查询一个。
  • 如果您的 50 个类之间存在共性,您可以使类中的属性更通用。很难看到你想要达到的目标。 50 个独特的查询很多。
【解决方案2】:

试试看这里:

LINQ: Can I pass a var as a parameter to a method?

或这里:

Passing the parameter

var 只能在本地使用时使用 变量被声明和初始化 在同一份声明中;变量 不能初始化为 null 或 方法组或匿名函数。

【讨论】:

    【解决方案3】:

    最简单的方法是创建一个具体类型来表示您的结果(上面的 MyType),而不是尝试传递匿名类型。

    var 实际上只供本地使用,编译器可以根据使用情况推断类型。一旦你将它传递给另一个方法,你就必须使用具体的类型。

    (虽然你可以让你的方法以“object”作为参数,但之后除了使用反射之外你将无法对它做太多事情)

    【讨论】:

      【解决方案4】:

      使用 .net 4 中的动态关键字

      DoStuff(new { Message = "Hello Monkey"}); 
      
      static void DoStuff(dynamic args)  
      {                  
          Console.WriteLine(args.Message);  
      }
      

      【讨论】:

        【解决方案5】:

        所以我解决了它...感谢我,(伟大的解决方案外观:

        System.Collections.IEnumerable i = from cr in db.ComprobanteRecepcions  join c in  db.Comprobantes
        on new { cr.RFC, cr.RFCProveedor, cr.Folio, cr.Serie }  equals new { c.RFC,  c.RFCProveedor, c.Folio, c.Serie }
        where
        Convert.ToString(cr.IDSucursal) == "4" &&
        cr.RFC == "FIN020938SVR "
        select new { cr.Serie, cr.Folio, cr.IDStatusComp, c.FechaEmision, c.Comentarios, c.Total  };
        return i;
        

        然后在数据网格中,我只是将 i 作为数据源,绑定它并瞧瞧!!

        【讨论】:

        • 不完全是您最初提出的问题,因为您没有具体说明您想在问题中将结果传递给什么,但很高兴您找到了一个解决方案来做您想做的事情。
        【解决方案6】:

        如果您想将其传递给您自己的方法,那么取决于您想要做什么(或者您愿意使用多少反射/约定,泛型可能是您的答案

        private string CheckMeOut<T>( T something )
        {
            return something.GetType().Name;
        }
        
        public void CheckMeOutTest( )
        {
            var anon = ( from x in typeof(string).GetMethods( )
                         select new {x.Name, Returns = x.ReturnType.Name} ).First( );
            string s = CheckMeOut( anon );
            Console.Out.WriteLine( s );
        }
        

        【讨论】:

          【解决方案7】:

          如果您使用的是 SQL 数据库,您是否考虑过从数据库自动生成数据实体模型 (.edmx)?然后,您可以使用那里生成的所有类,避免这整个混乱。

          【讨论】:

            猜你喜欢
            • 2012-12-26
            • 2012-11-19
            • 1970-01-01
            • 2012-01-11
            • 1970-01-01
            • 2018-03-02
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多