我正在尝试将直接(断开连接的)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条记录。
答案 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,以避免“加载数据集,然后立即再次过滤”场景。