2010-07-28 370 views
0

我从来没有找到一个优雅的方式来做到这一点,所以我想知道其他开发人员喜欢什么方法(为了性能,可读性等)。DataTable.Select使用IN运算符

有没有办法在DataTable.Select()函数中使用LIKE运算符,基于对另一个DataTable的查询结果。例如,在SQL Server中,语法为:

Select SomeValue 
From Table1 
WHERE MyField IN 
    (Select SomeField From Table2 Where SomeColumn = SomeFilterVariable) 

我知道,从编码的角度看,这是一个非常简单的查询做对DB,但这是一个应用程序正在做那里做由于计算涉及的次数多,这种方式会导致成千上万次对服务器的调用。我已经计算了它,并且一次获取所有数据并使用DataTable.Select()或DataTable.Compute()来获得我需要的结果会更好。

我对任何包括LINQ到数据集等都是开放的。我真正需要避免的是到服务器的很多次旅行。

回答

1
from t1 in db.Table1 
where (from t2 in db.Table2 where t2.SomeColumn = SomeFilterVariable select t2.SomeField).Contains(t1.MyField) 
select t1.SomeValue; 

如果这对你来说太乱:

var subQ = from t2 in db.Table2 
      where t2.SomeColumn = SomeFilterVariable 
      select t2.SomeField; 

var query = from t1 in db.Table1 
      where subQ.Contains(t1.MyField) 
      select t1.SomeValue; 

这里的很酷的事情是这样的LINQ工作,将建立&只执行一个SQL语句,基本持平你发布的SQL。

+0

但是,这将转到服务器来执行此操作,对吗?我特别注意避免前往数据库服务器,并首先获取数据(整个表),然后针对内存中的DataTable(DataSet的一部分)执行类似的查询。尽管我会为此选择一个好的Linq语法,我可以在另一个DB往返性能损失并不那么可怕的情况下使用。 – David 2010-07-28 17:22:47

+0

如果集合(db.Table1&db.Table2)是Table实体,它将转到数据库。如果他们是regaulr收集,它会在记忆中工作。语法应该保持不变。 – 2010-07-28 18:00:34

+0

你是对的...谢谢。 – David 2010-07-29 15:27:50

0

上面的例子中,我想你可以使用RIGHT JOIN来获得你想要的数据。在这里:

SELECT A.SomeValue 
FROM Table1 A 
RIGHT JOIN Table2 B 
ON A.MyField = B.SomeField 
WHERE B.SomeColumn = SomeFilterVariable 
+0

再次,这是去DB。我想在已经从数据库填充的内存数据集上执行此操作。 – David 2010-07-28 17:24:32

+0

我想,如果“原始数据”没有改变,你可以使用一些临时数据表和一对夫妇循环... – 2010-07-28 17:32:07

+0

它不。这是调查截止日期后的调查结果列表。这是我正在使用的方法。我正在寻找更干净的东西,但谢谢你花时间回复。 – David 2010-07-28 18:22:27