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
Entity framework Linq到SQL如何编写;不在「;查询_Entity Framework_Linq_Linq To Sql_Linq To Entities - Fatal编程技术网

Entity framework Linq到SQL如何编写;不在「;查询

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

我有以下3个表(每种车型1个基本表和其他2个卫星表。)

车辆

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