我正在使用一个MVC4 Web应用程序,我正在使用LINQ。
我有以下查询,在SQL中产生了53行。
select * from table1 t join
[table2] tpf on t.TestID=tpf.TestID
join
table3 pf on tpf.Test2ID =pf.Test2ID
join table4 pfp on
pf.Test3ID = pfp.Test3ID
join table5 p on pfp.Test5ID = p.Test5ID where t.testtypeid=1
order by pfp.Test3ID,pf.Test2ID
如果我转换下面的相同查询,则返回更多记录。
trvm.MyTestVMs = (
from tt in db.table1s
join ttpf in db.table2s on tt.TestID equals ttpf.TestID
join pf in db.table3s on ttpf.Test2ID equals pf.Test2ID
join pfp in db.table4s on pf.Test3ID equals pfp.Test3ID
join p in table5s on pfp.Test5ID equals p.Test5ID
where tt.testtypeid == 1
orderby pfp.Test3ID
orderby pf.Test2ID
select new MyTestVM
{
FamilyID = pf.Test2ID,
ProductID = p.Test3ID,
Desc = p.Description
}
).ToList();
从SQL和上面的LINQ获得的结果会有所不同。实际上,我从LINQ查询中获得了一些重复的结果。造成这种差异的原因是什么?
答案 0 :(得分:0)
结果是不同的,因为在你的第二个查询中,你有两个“OrderBy”,因此,第二个OrderBy它对集合起作用,这是第一个“OrderBy”的结果,并且正在重新排序这些项目。 改变
orderby pfp.ProductID
orderby pf.ProductFamilyID
来自中的第二个查询的
orderby pfp.ProductID, pf.ProductFamilyID
获得相同的结果
答案 1 :(得分:0)
事实证明,由于使用c.closeTrade( () -> c.closeBrokerTrade(new Trade()) );
c.closeTrade( () -> c.closeBrokerTrade("123") );
查询变量(未在帖子中显示)导致products
链接表之一,LINQ查询不等于发布的SQL查询被包括两次,从而产生更多记录。
解决问题的一种方法是将many-to-many
替换为products
并应用与您尝试重复使用的查询变量相同的过滤器。
但是如果你想重用查询变量,那么这是正确的方法:
db.Products
现在最后一个查询的SQL(有问题的SQL)看起来像这样
// Eliminate the need of DbFunctions.TruncateTime(dt) inside the queries
dt = dt.Date;
// Queries
var productFamilys = (
from tt in db.TestTypes
join ttpf in db.TestTypeProductFamilys on tt.TestTypeID equals ttpf.TestTypeID
join pf in db.ProductFamilys on ttpf.ProductFamilyID equals pf.ProductFamilyID
where tt.TestTypeID == TestTypeID
where DbFunctions.TruncateTime(pf.StartDate) <= dt
where DbFunctions.TruncateTime(pf.EndDate) > dt
select pf
);
var productFamilyProducts = (
from pf in productFamilys
join pfp in db.ProductFamilyProducts on pf.ProductFamilyID equals pfp.ProductFamilyID
join p in db.Products on pfp.ProductID equals p.ProductID
where DbFunctions.TruncateTime(p.StartDate) <= dt
where DbFunctions.TruncateTime(p.EndDate) > dt
select new { Family = pf, Product = p }
);
var products = (
from pfp in productFamilyProducts
select pfp.Product
);
var productFamilyProductVMs = (
from pfp in productFamilyProducts
orderby pfp.Product.ProductID, pfp.Family.ProductFamilyID
select new ProductFamilyProductVM
{
ProductFamilyID = pfp.Family.ProductFamilyID,
ProductID = pfp.Product.ProductID,
ProdDesc = pfp.Product.Description
}
);
// Results
trvm.ProductFamilys = productFamilys.ToList();
trvm.Products = products.ToList();
trvm.ProductFamilyProductVMs = productFamilyProductVMs.ToList();
即。非常类似于示例SQL查询,应该产生相同的结果。