2016-11-17 127 views
0

有谁知道如何翻译此内容?当我打开调试器时,我得到3个不同的查询,而var包含一组结果。我试图用一个将调用存储过程的方法替换该行,但我不明白查询应该是什么。非常感谢将LINQ转换为SQL

var restbl = 
     context.tbl_one.FirstOrDefault(d => d.qty < d.tbl_two.Count(a => !a.tbl_three.ust)) 
    ?? context.tbl_one.FirstOrDefault(d => d.qty > d.tbl_two.Count(a => !a.tbl_three.ust)); 


{SELECT 
`Extent1`.`id`, 
`Extent1`.`name`, 
`Extent1`.`qty`, 
`Extent1`.`cdate` 
FROM `tbl_one` AS `Extent1`} 

{SELECT 
`Extent1`.`id`, 
`Extent1`.`tbl_one_id`, 
`Extent1`.`tbl_three_id`, 
`Extent1`.`enabled` 
FROM `tbl_two` AS `Extent1`} 

{SELECT 
`Extent1`.`id`, 
`Extent1`.`ttid`, 
`Extent1`.`code`, 
`Extent1`.`cdate`, 
`Extent1`.`mdate`, 
`Extent1`.`prt`, 
`Extent1`.`ust` 
FROM `tbl_three` AS `Extent1`} 

var countToAdd = restbl.qty - context.tbl_two.Count(a => a.tbl_one_id == restbl.id && !a.tbl_three.ust); 
+0

你应该重构LINQ语句转换成'context.tbl_one.FirstOrDefault(d => firstCondition || secondCondition)'。这将是一个SQL语句。 –

+0

但条件有道理吗?是不是像'qty!= count'一样? –

+0

谢谢@GertArnold,对不起,我的linq理解非常糟糕。我总是使用存储过程并避免使用linq。我知道很多人会说我应该使用linq来代替,但是使用直接sql并且创建一个方法来调用它会容易得多。条件是有道理的,程序工作正常,我只是想替换edmx和linq。 – carol1287

回答

1

您可以使用LINQPad或Linquer工具轻松地将您的linq查询转换为SQL,反之亦然。它们在转换复杂查询中非常有用。

0

我的假设是:(假设你使用MSSQL)

result= SELECT TOP 1 FROM tbl_one t1 WHERE t1.qty< (SELECT COUNT(*) FROM tbl_two t2 INNER JOIN tbl_three t3 ON t3.id=t2.tbl_three_id WHERE t3.ust = 0 AND t1.id=t2.tbl_one-id) 

if (result IS NULL) 
result= SELECT TOP 1 FROM tbl_one t1 WHERE t1.qty> (SELECT COUNT(*) FROM tbl_two t2 INNER JOIN tbl_three t3 ON t3.id=t2.tbl_three_id WHERE t3.ust = 0 AND t1.id=t2.tbl_one-id) 
+0

非常感谢你@olealbers,这有很大的帮助,我会尝试这个,因为吸烟现在是从我的脑海里出来的。 MySQL而不是MSSQL,但我猜语法会非常相似。 – carol1287

+0

你碰巧知道var countToAdd的正确查询吗?非常感谢 – carol1287