2011-03-23 62 views
2

我需要查询的实体框架对象集合,并找到符合的参数列表中的对象的列表对象。例如,对象可能包含字段(p1,p2,p3,p4,... pn)。 (p1 = 3,p2 = 7,P3 = 23),(p1 = 3,p2 = 43,p3 = 45),(p1 = 1,p2 = 232, p3 = 321)。LINQ使用的元组

由于集合可以包含很多元素,我可以找很多(前80)这样的元组,我不希望这样做在一个循环中,因为这将需要大量的往返。我宁愿这样做是一个单一的LINQ语句。这可能吗?

感谢,

杰里

+0

“我想找到3个对象”:这是否意味着将有完全匹配每个条件的对象?我有点困惑,因为这似乎与“我可能正在寻找很多(例如80)这样的元组”相矛盾。 – Ani 2011-03-23 22:53:05

+1

@Ani:我读它,因为他已经在服务器上的许多对象,他希望那些3场比赛,即:3个对象回来......(不知道这是一个正确的解释,虽然) – 2011-03-23 23:03:54

回答

0

是的,你可以这样做。只要这样做:

var matches = entities.Where(e => 
     (e.p1 == 3 && e.p2 == 7 && e.p3 == 23) 
    || (e.p1 == 3 && e.p2 == 43 && e.p3 == 45) 
    || (e.p1 == 1 && e.p2 == 232 && e.p3 == 321)); 
+1

'只是do'听起来很有趣,考虑到他的'很多(前80)'元组 – Snowbear 2011-03-23 22:40:27

+0

@Snowbear:问题措辞方式,这听起来像这个问题被避免往返。这在一次往返中完成了所有工作 - 虽然这是可能的丑陋,但它在OP尝试避免的方面是有效的...... – 2011-03-23 23:02:30

+0

同意它可以用于这个** 1 **样本。如果你有不同数量的输入条件,我相信在OP的问题中就是这种情况,我只是不明白如何轻松实现它。虽然这只是我的猜测,但我并不确定。 – Snowbear 2011-03-23 23:05:18

1

你可以试试下面的办法,虽然我不知道它会使用LINQ到实体工作。

IEnumerable<Tuple<int, int, int>> criterias = ...; 

var filteredObjects = DataContext.YourObjects 
       .Join(criterias, 
         o => new {o.P1, o.P2, o.P3}, // your objects key 
         c => new {o.P1, o.P2, o.P3}, // criteria key 
         (o, c) => o); 
+0

您可能需要'YourObjects.AsEnumerable( )'让这个工作。 – Gabe 2011-03-23 22:56:23

+0

@加贝,它不会是OP所需要的。他需要在SQL端对它进行过滤,所以向下压缩到“IEnumerable”并不是一个好主意,尽管它肯定会使这个系数工作。 – Snowbear 2011-03-23 23:01:11

+0

我不认为你可以在服务器上对IEnumerable进行连接。为了得到这个工作,你必须为WHERE子句生成一个谓词表达式。 – Gabe 2011-03-23 23:23:52