如何将 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() 方法?