Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/linq/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
LINQ vs.DataTable.Select-如何获得相同的结果?_Linq_Linq To Sql - Fatal编程技术网

LINQ vs.DataTable.Select-如何获得相同的结果?

LINQ vs.DataTable.Select-如何获得相同的结果?,linq,linq-to-sql,Linq,Linq To Sql,我正在尝试重写直接(断开连接的)DataSet.DataTable.Select to LINQ以进行文本搜索: string search = "ProductNo like '%" + searchpattern + "%' OR ProductName like '%" + searchpattern + "%' OR Description like '%" + searchpattern + "%'"; DataSetProducts.sk_productsRo

我正在尝试重写直接(断开连接的)DataSet.DataTable.Select to LINQ以进行文本搜索:

string search = "ProductNo like '%" + searchpattern + 
    "%' OR ProductName like '%" + searchpattern + 
    "%' OR Description like '%" + searchpattern +  "%'";

DataSetProducts.sk_productsRow[] dsp = (DataSetProducts.sk_productsRow[])dsProducts.sk_products.Select(search, sort);
这真的很快。但是,如果我在LINQ中重新执行它:

productlist = from prds in dsProducts.sk_products.AsEnumerable()
    where (prds.Field<string>("productno").Contains(searchpattern) || 
           prds.Field<string>("productname").Contains(searchpattern) || 
           prds.Field<string>("description").Contains(searchpattern))
    select prds;
productlist=来自dsProducts.sk_products.AsEnumerable()中的PRD
其中(prds.字段(“productno”)包含(searchpattern)|
prds.Field(“productname”)。包含(searchpattern)|
prds.字段(“说明”).包含(搜索模式))
选择PRD;
由于文本操作,它变得非常慢,并且返回的行要少得多。
如何以同样的速度获得同样的结果?我在表中只有约1000条记录。

至于为什么它返回的行更少,这是一个区分大小写的问题吗?(即,“like”默认情况下不区分大小写;“Contains”默认情况下不区分大小写)


如果在LINQ到SQL数据库上下文中运行,使用System.Data.Linq.SqlClient.SqlMethods.Like操作而不是String.Contains。

执行Linq查询与断开连接的数据集时,之所以会看到速度上的差异,是因为在使用Linq查询时,数据集已在内存中


除此之外,如果您尚未安装,它将向您显示实际执行的查询

这是个愚蠢的问题,但是.AsEnumerable()对于某些东西来说是必要的吗?到目前为止,我只对Linq2Sql有经验,但我通常会尽可能长时间地将事情视为可查询的,以避免出现“加载数据集,然后立即再次筛选”的情况。

我自己从未使用过它,但可能有助于加快速度…

我知道,目前这并不重要;如果我添加.ToLower().Contains(),情况会更糟。这是这种方法的本质-ToLower()需要对字符串进行一次传递,并包含()一个新的。如果您使用不区分大小写的比较器,您可以通过一次传递实现同样的效果。顺便说一句,虽然使用ToLower()似乎很自然,但实际上.NET framework针对ToUpper()进行了优化(原因我不知道)。遗憾的是,这里不能使用System.Data.Linq.SqlClient.SqlMethods.Like,因为它不是数据库上下文。它不显示,因为它不是linq2sql查询;数据集是从Web服务填充的。是的,因为数据来自Web服务,而不是(直接)来自数据库。否则,它根本不起作用:“找不到源类型的DATA类型的数据查询模式的实现。SkjPosithDATActudia.”。“没有找到。请考虑显式指定范围变量‘PRDs’的类型。”