2009-06-03 64 views
0

我如何使用第二个表达式来选择只有那些ID从第一个?lambda扩展来组合列表

var list1= from x in objects select x.id; 


results=results.Where(r=>r.id== ???? ) 

我想要的结果是只有那些ID从listA的

TIA

编辑:我站在纠正,还有一个问题引起的问题,我会询问分开。

回答

4

猜测的位(没试过运行的话),但是:

var filteredResults = from obj in objects 
         join result in results on obj.id equals result.id 
         select result; 

请注意,这应该代替你在你的问题中的代码行。

+0

这也适用,但我想知道哪一种效率更高? – zsharp 2009-06-04 20:53:44

4

是这样的...

results.Where(r=>list1.Contains(r.id)) 
+0

可能会非常棘手,如果list1和结果包含很多项目... – 2009-06-03 01:03:38

+0

没有工作见上述 – zsharp 2009-06-03 01:08:06

+0

我坚持认为这是解决您所描述的问题 – spender 2009-06-03 08:41:12

4
results = results.Where(r => list1.Contains(r.id)); 
+0

没有工作见上面 – zsharp 2009-06-03 01:08:19

+0

你是什么意思没有工作?你有例外吗?这正是它应该如何工作;如果list1是一个int列表,它会在结果中检查对象的int属性以查看它们是否存在于列表中。我只是用一些虚拟类在我的机器上测试过它,它运行得很完美。发布无论是错误还是更多的代码... – BFree 2009-06-03 01:11:53

+0

我站在纠正,有另一个问题导致问题,我会问关于分开。 – zsharp 2009-06-04 20:41:46

2

如果你想要一些性能(list.Contains()有一个O(n)的复杂性),你可以用

var ids = objects.ToDictionary(o => o.id); 

results.Where(o => ids.ContainsKey(o.id)); 
+0

这给了一个错误。这应该与linqtosql一起工作? – zsharp 2009-06-04 20:54:35

+0

呃,没有这是Linq只有对象。如果你希望它在SQL中通过lin翻译成sql,你应该在问题中(和标签中)指定它。 此外,如果您说出了确切的错误,那将会很有帮助。 – 2009-06-04 20:58:17

0

也许去你想要这个吗?

results.Where(R => objects.Any(O => o.id == r.id))

0

如果你总是只需要第一个元素的ID,你可以将其存储到变量,用它来lambda表达式

var results= from x in objects select x.id; 
int firstID = results.First().id ; 
results=results.Where(r=>r.id== firstID ) 

或者,直接使用这样的:

var results= from x in objects select x.id; 
results=results.Where(r=>r.id== results.First().id )