[英]How to pass var type as parameter to another method
我的代码中有下面的Linq查询
var query = (from s in dc.UserContacts
join g in dc.EmailRecipientInGroups on s.UserEmailRecipient.RID equals g.RID
join zk in dc.ZeekUsers on s.UserID equals zk.UserId
where s.aspnet_User.LoweredUserName.Equals(strUserName.ToLower())
&& !g.UserEmailRecipientGroup.IsDeleted
&& !s.UserEmailRecipient.IsDeleted
select new { s = s, g = g, zk = zk });
其中dc是Linq to SQL的DataContext
我需要在上面的查询中包含其他两个条件,但下面的行将保持不变
select new { s = s, g = g, zk = zk });
我有两个针对这两个条件创建两个单独的方法。 但是用于生成输出的最终代码对于所有这三个函数都是相同的,并且将根据查询对象生成输出。
因此,我正在考虑编写一个新的私有方法,该方法可以在所有3个函数的上述行之后以查询作为参数进行调用,并获取结果,而不是每次都重复代码。 但是从互联网上我发现var类型不能作为参数传递。
这是我将鼠标悬停在查询词之前的var
关键字上时来自Visual Studio的Intellisense
interface System.Linq.IQueryable<out T>
T is 'a
Anonymous types:
'a is new { usercontact s, EmailRecipientinGroup g, Zeekuser zk}
您的var是一个匿名类型,您不能将其传递到函数范围之外(可以使用dynamic
或ExpandoObject
,但不建议这样做)。
如果要将结果传递给另一种方法,则需要一种具体的类型。
//Elsewhere in your code
class Result
{
public usercontact UserContact {get; set;}
public EmailRecipientinGroup Group {get; set;}
public Zeekuser ZeekUser {get; set;}
}
var query = (from s in dc.UserContacts
join g in dc.EmailRecipientInGroups on s.UserEmailRecipient.RID equals g.RID
join zk in dc.ZeekUsers on s.UserID equals zk.UserId
where s.aspnet_User.LoweredUserName.Equals(strUserName.ToLower())
&& !g.UserEmailRecipientGroup.IsDeleted
&& !s.UserEmailRecipient.IsDeleted
select new Result{ UserContact = s, Group = g, ZeekUser = zk }); //Only this line changed.
现在, query
将是IQueryable<Result>
,您可以将其传递给其他函数。
var
将在运行时定义为实际类型,并且可以正常使用。 但是,您的var
是一个Anonymous类型的IQueryable
,这将无法工作。 为了能够将它们传递给其他函数,您可以使用Tuple或必须自己定义类并在linq查询中使用它。
正如其他人已经说过的那样, “在方法范围内声明的变量可以具有隐式类型var。对隐式类型的局部变量进行强类型化,就像您自己声明了该类型一样,但是编译器确定该类型。”
但是,这是声明属于或涉及匿名类型的类型的变量的唯一方法。
现在到LINQ部分。 您可以将LINQ查询视为数据库视图定义(它们仅在枚举时执行),但有很大的好处:它们是可组合的。
您可以这样写:
IQueriable<UserContact> userContactsQuery =
from s in dc.UserContacts
where s.aspnet_User.LoweredUserName.Equals(strUserName.ToLower())
&& !s.UserEmailRecipient.IsDeleted
select s;
IQueriable<EmailRecipientInGroup> emailRecipientInGroupsQuery =
from g in dc.EmailRecipientInGroups
where !g.UserEmailRecipientGroup.IsDeleted
select g;
IQueriable<ZeekUser> zeekUsersQuery =
from z in db.ZeekUsers
select z;
var query = from s in userContactsQuery
join g in emailRecipientInGroupsQuery on s.UserEmailRecipient.RID equals g.RID
join zk in zeekUsersQuery on s.UserID equals zk.UserId
select new { s = s, g = g, zk = zk });
我会自己使用var
但这只是为了表明您可以查询大多数查询。
您可能需要考虑将其他条件插入查询的中间而不是结尾。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.