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

时间:2009-05-11 17:10:40

标签: linq linq-to-sql

我正在尝试将直接(断开连接的)DataSet.DataTable.Select重写为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;

由于文本操作,它变得非常慢,并且将返回更少的行。 如何以相同的速度获得相同的结果?我表中只有约1000条记录。

4 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

我自己从未使用它,但也许i4o - Indexed LINQ可能有助于加快速度......

答案 2 :(得分:0)

当您执行LINQ查询与断开连接的数据集时,您看到速度差异的原因是因为数据集已在内存中,而LINQ查询在使用时执行。

除此之外,如果您尚未安装LINQ Visualizer,它将显示实际正在执行的查询。

答案 3 :(得分:0)

愚蠢的问题,但是.AsEnumerable()是必要的吗?到目前为止我只使用Linq2Sql,但我通常会尽可能长时间地将事物视为AsQueryable,以避免“加载数据集,然后立即再次过滤”场景。