如何将 linq var 数据类型传递给方法? [复制]

Posted

技术标签:

【中文标题】如何将 linq var 数据类型传递给方法? [复制]【英文标题】:How can I pass a linq var datatype to a method? [duplicate] 【发布时间】: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,好吧,假设我能做到,我该如何拆箱变量? 【参考方案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)?然后,您可以使用那里生成的所有类,避免这整个混乱。

【讨论】:

以上是关于如何将 linq var 数据类型传递给方法? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

如何将 Predicate<T> 传递给 Linq to SQL 中的 Where() 方法?

LINQ学习

将多个条件传递给 LINQ FirstOrDefault 方法

将 Func 传递给 Linq 到实体 Sum(..)

使用 LINQ 作为 DAL 时如何传输数据?

C# 静态类如何赋值,LINQ有关。