【问题标题】:C# Entity Framework and Linq queryC# 实体框架和 Linq 查询
【发布时间】:2019-01-23 00:21:27
【问题描述】:

在下面的查询构建中,Where 子句 B 是否与 Where 子句 A 分开?

truckList = (from truck in _dbcontext.Truck.Where(x => x.ClientId == clientId) //(A)
    join comp in _dbcontext.TruckComponent
    on truck.Equipment.ProtId equals comp.ComponentId
    where truck.EquipmentId > 0 && truck.FieldId > 0 //B
    select NewTruckVmFromDbTruck(truck, comp)).AsEnumerable();

它们可以只加入 A 或 B 吗?例如:

truckList = (from truck in _dbcontext.Truck.Where(
                x => x.ClientId == clientId && 
                truck.EquipmentId > 0 && 
                truck.FieldId > 0)
                ...rest of query...
             )

【问题讨论】:

  • 运行 SQL 跟踪时,两个 LINQ 查询是否生成相同的数据库查询?
  • Where 子句 B 不依赖于 comp 上的任何内容,因此无需与 A 分开

标签: c# entity-framework linq lambda


【解决方案1】:

无论如何,最好不要混合使用 fluent 和 lambda 查询语法,怎么样:

truckList = (from truck in _dbcontext.Truck
             where truck.EquipmentId > 0 && truck.FieldId > 0 && truck.ClientId == clientId
             join comp in _dbcontext.TruckComponent on truck.Equipment.ProtId equals comp.ComponentId
             select NewTruckVmFromDbTruck(truck, comp)).AsEnumerable();

【讨论】:

    【解决方案2】:

    这是因为 'truck' 和 'comp' 来自不同的表

    truckList = (from truck in _dbcontext.Truck.Where(x => x.ClientId == clientId) //(A)
    join comp in _dbcontext.TruckComponent
    on truck.Equipment.ProtId equals comp.ComponentId
    where truck.EquipmentId > 0 && truck.FieldId > 0 //B
    select NewTruckVmFromDbTruck(truck, comp)).AsEnumerable();
    

    卡车来自名为“卡车”的表,而 comp 来自名为“TruckComponent”的表

    两者的身份不同,如果只选择'Truck'表,则不会得到'TruckComponent'表数据。

    select NewTruckVmFromDbTruck(truck)).AsEnumerable();
    

    希望对你有帮助

    【讨论】:

    • B 实际上不是“来自 TruckComponent”。所以你错了。 B 是独立的,适用于两个表。要引用TruckComponent,请使用comp,因为它在join 语句中定义
    • 哦,如果是这样,那么任何一种方式都可以使用。我想念“条款”这个词。
    • 来自卡车在 _dbcontext.Truck.Where(x => x.ClientId == clientId && x.EquipmentId > 0 && x.FieldId > 0
    • 您能否编辑您的答案以显示此内容。 A 和 B 来自不同的表格部分会误导某人或让你对这个答案持否定态度
    • 啊,我明白了,有点棘手的问题,也许下次我在回答时应该更加小心,因为你指出了我犯的错误,而不是希望找到问题的答案。很抱歉犯了愚蠢的错误,以后不会再发生了
    猜你喜欢
    • 2021-12-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多