【问题标题】:Linq output multiply resultsLinq 输出乘法结果
【发布时间】:2016-12-23 12:47:52
【问题描述】:

我有一个这样的简单 SQL 查询:

SELECT table1.[idGK]  , table2.FullName , table2.LgotName
 from table2
 join table1 on table2.C_LGT = table1.[idGK] 
where table1.mcod = 41003 

我有正确的输出:

idGK | FullName| LgotName 
------------------------                           
1    |One      |Ball                             
2    |Two      |Wog                           
3    |Three    |Aks  
5    |Four     |Mqi                             
7    |Five     |Thel                           
9    |Six      |Imx  

但是当我对此进行 LINQ 查询时:

IEnumerable<FinalDoc> fidn = from post in repository.table1
join thir in repository.table2 on post.idGK equals thir.C_LGT
where  post.mcod.Trim().Contains("41003")

orderby post.idGK

select new FinalDoc
  {
     mcod = post.mcod,
    FullName= thir.FullName,
     idGK = post.idGK
 }; 

我有这个结果:

    FullName  | LgotName 
    ------------------------                           
    Five      |Thel                             
    Five      |Thel                            
    Five      |Thel  
    Five      |Thel                              
    Five      |Thel                            
    Five      |Thel 

我尝试更改表 1 和表 2 以进行正确连接,但结果相同。
我需要做什么 linq 查询才能得到与 SQl 相同的结果?
P.S EF、Linq、Asp.net、Web 表单

【问题讨论】:

  • 为什么 SQL 中的 where table1.mcod = 41003 和 Linq 中的 post.mcod.Trim().Contains("41003") 有这种区别?
  • 可能是因为 sql 查询使用 equal 而 linq 查询使用 contains( sql like "%something%")?这意味着 sql 查询将 41003 与 41003 匹配,而 linq 查询可以将 41003 与 141003、410032、87234741003342 等匹配
  • 您是否尝试检查从实体框架生成的正在运行的 SQL 查询?
  • @RajshekarReddy 如果我在 linq 中使用 post.mcod == "41003" 我有空结果
  • @RajshekarReddy 如果我删除 where 子句我拥有所有记录

标签: c# asp.net entity-framework linq


【解决方案1】:

您的 SQL 查询的 LINQ 等效项是:

from thir in repository.table2
join post in repository.table1 on thir.C_LGT equals post.[idGK]
where post.mcod == 41003

所以假设你的 SQL 是正确的(即 table1.mcod 是数字类型而不是字符串)那么它应该可以工作。

编辑: 您可以尝试这个来查看 SQL EF 从您的 LINQ 生成的内容。它可能有助于诊断问题。

var query = from post in repository.table1
join thir in repository.table2 on post.idGK equals thir.C_LGT
where post.mcod.Trim().Contains("41003")

var sql = ((System.Data.Objects.ObjectQuery)query).ToTraceString();

【讨论】:

  • 我在 linqpad 中测试我的查询,它也是正确的,就像你的一样。我检查了 variables ,它的类型都正确,也许我的 EF 有问题,但我不知道在哪里可以看到,因为另一个查询效果很好。
【解决方案2】:

我解决了这个问题,但答案很简单:
我的问题是我没有添加到我的类定义主键行,因为我有这个结果。
在我的表中我没有主键,我添加了 id 行,因为 EF 需要主键,如果你没有添加它们,EF 将为你完成这项工作(并采取第一行)。就我而言,我添加了 idG 行:

[Key]
    public int idG {get;set;}
    public int idGK { get; set; }
    public string mcod { get; set; }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多