Entity framework Linq到SQL如何编写;不在「;查询
我有以下3个表(每种车型1个基本表和其他2个卫星表。) 车辆Entity framework Linq到SQL如何编写;不在「;查询,entity-framework,linq,linq-to-sql,linq-to-entities,Entity Framework,Linq,Linq To Sql,Linq To Entities,我有以下3个表(每种车型1个基本表和其他2个卫星表。) 车辆 ID VehicleType ----------------------------- 1 Car 2 Truck ID Make Model ------------------------- 1 Toyota Camry 2 Honda Accord ID Make Model -------------------- 1 Ford
ID VehicleType
-----------------------------
1 Car
2 Truck
ID Make Model
-------------------------
1 Toyota Camry
2 Honda Accord
ID Make Model
--------------------
1 Ford F150
2 Dodge Ram
汽车
ID VehicleType
-----------------------------
1 Car
2 Truck
ID Make Model
-------------------------
1 Toyota Camry
2 Honda Accord
ID Make Model
--------------------
1 Ford F150
2 Dodge Ram
卡车
ID VehicleType
-----------------------------
1 Car
2 Truck
ID Make Model
-------------------------
1 Toyota Camry
2 Honda Accord
ID Make Model
--------------------
1 Ford F150
2 Dodge Ram
然后我有相应的DTO
public class VehicleDTO
{
public int ID {get;set;}
public int VehicleType {get;set;}
public IEnumerable<CarDTO> Cars {get;set;}
public IEnumerable<TruckDTO> Trucks {get;set;}
}
public class CarDTO
{
public int ID {get;set;}
public string Make {get;set;}
public string Model {get;set;}
}
public class TruckDTO
{
public int ID {get;set;}
public string Make {get;set;}
public string Model {get;set;}
}
上面的查询引发异常
消息“非静态方法需要目标。”字符串
问题
1> 如何构造此查询
2> 我是否可以使用
AnyAsync
和ToListAsync
进行此查询async
。(我知道我必须使方法与Task异步,并在内部使用Wait,但我无法理解异步查询语法)这是因为当一个表来自dbContext,另一个来自内存中的enumerable时,不能在linq中使用嵌套查询,因此,如果dbcontext.Cars
和dbcontext.Trucks
没有太多行,最好将它们加载到内存中并使用嵌套查询,如下所示:
var listCars = dbcontext.Cars.ToList();
var listTrucks = dbcontext.Trucks.ToList();
var cars = (from dto in dtos
where !(from c in listCars
select new { c.Make, c.Model })
.Any(x => dto.VehicleType == 'Car' && dto.Car.Make == x.Make && dto.Car.Model == x.Model)
select dto).ToList();
var trucs = (from dto in dtos
where !(from t in listTrucks
select new { t.Make, t.Model })
.Any(x => dto.VehicleType == 'Truck' && dto.Truck.Make == x.Make && dto.Truck.Model == x.Model)
select dto).ToList();
此外,您的方法存在性能问题-您执行N查询-每个
dto
一个查询,而不是只执行两个查询:一个用于汽车,一个用于卡车:
var allCars = dtos.Where(x => x.VehicleType == "Car").ToList()
.SelectMany(x => x.Cars.Select(y => y.Make + "-" + y.Model).ToList()).ToList();
var existedCars = await dbcontext.Cars.Where(x => allCars.Contains(x.Make + "-" + x.Model))
.Select(x => x.Make + "-" + x.Model).ToListAsync();
var newCars = allCars.Except(existedCars).Select(x =>
{
var temp = x.Split('-');
return new CarDTO
{
Make = temp[0],
Model = temp[1]
};
}).ToList();
//exactly same code for Trucks