我有以下(概括的)查询:
var listOfPossibleCars= new List<string>();
var listOfCars = db.Cars.Where(s => listOfPossibleCars.Contains(s.CarName)).ToList();
但是
listOfPossibleCars
很大,包含数十万条记录。这个查询导致了延迟,我想知道如何改进它。我有以下(概括的)查询:
var listOfPossibleCars= new List<string>();
var listOfCars = db.Cars.Where(s => listOfPossibleCars.Contains(s.CarName)).ToList();
listOfPossibleCars
很大,包含数十万条记录。这个查询导致了延迟,我想知道如何改进它。不要使用内存集合来完成此操作,而应将 listOfPossibleCars
数据插入到数据库中的临时表中,该表需要有适当定义的索引和分区,并在数据库中完成此操作。使用适当定义的表,数据库将执行哈希连接。
数据放入数据库后,查询将如下所示:
//Instead data to database
from car in db.Cars
join possibleCar in db.PossibleCars on car.CarName equals possibleCar.CarName
select car;
如果listOfPossibleCars相对静态(根本不改变或至少不经常改变),您确实可以按照另一个答案中描述的方式将其放入数据库。当情况不是这样时,并且假设您使用SQL Server,则可以使用表值参数。请注意,Entity Framework在包含大量数据的情况下,Contains方法非常缓慢。
首先在数据库中创建自定义表类型:
CREATE TYPE MyType AS TABLE
(
CarName varchar(200) primary key
)
然后像这样查询(请注意,这是我脑海中的代码,未经测试,如果有问题请问):
var listOfPossibleCars = new List<string>();
var dt = new DataTable();
dt.Columns.Add("CarName");
foreach (var car in listOfPossibleCars) {
dt.Rows.Add(car);
}
var possibleCars = new SqlParameter("possibleCars", SqlDbType.Structured);
possibleCars.Value = dt;
possibleCars.TypeName = "dbo.MyType";
var listOfCars = db.Cars.SqlQuery("select C.* from Cars C inner join @possibleCars P on C.CarName = P.CarName", possibleCars).ToList();
是的,你必须使用原始的SQL查询,但如果你的列表非常庞大,仅使用Entity Framework可能无法高效地执行这样的查询。