2010-08-13 47 views
3

我可以通过搞乱代码库的部分代码来解决这个问题,但我想问一下看看是否有更简单的方法来做到这一点。在LINQ声明中输出变量

我有以下linq查询。

(select a in objectA 
where a.type = 1 
select new 
{ 
    Id = a.Id, 
    Field2 = <needThisValue> 
    Field3 = <needThisValue> 
}).ToList(); 

现在两个“needThisValues”需要通过了一个接受的方法的变量来提供,如

TestMethod(object a, out string stringA, out string StringB) 

那么,有没有反正我可以巧妙地在LINQ中调用此方法声明来填充这两个字段?

在此先感谢。

回答

5

我不认为你可以在查询表达式中做到这一点,但你可以用块拉姆达语句做到这一点:

var query = objectA.Where(a => a.type == 1) 
        .Select(a => { 
           string Field2; 
           string Field3; 
           TestMethod(a, out Field2, out Field3); 
           return new { 
            a.Id, Field2, Field3 
           }; 
          }); 
        .ToList(); 

我想我个人更喜欢使用返回一个元组的方法,然后用它来处理,但上面应该可以。

+0

看起来它会做的工作,我本来喜欢用一个元组,但不幸在这种情况下,我被限制为3.5 :( – 2010-08-13 13:16:20

1

您大概可以创建一个返回一个Tuple并使用它的私有方法。

线沿线的东西:

private Tuple<string,string> TestMethodInternal(object a) 
{ 
    string stringA; 
    string stringB; 

    TestMethod(a, out stringA, out stringB); 

    return Tuple.Create(stringA, stringB); 
} 

然后你可以使用它在let语句是这样的:

... 
where a.type = 1 
let t = TestMethodInternal(a) 
select new 
{ 
    Id = a.Id, 
    Field2 = t.Item1, 
    Field3 = t.Item2, 
} 

没编译这个那么有可能是错误在那里..

+0

我也喜欢这个答案,以前从来没有遇到let声明。 谢谢 – 2010-08-13 13:22:57