Linq结果与sql结果不同

时间:2016-02-17 14:24:13

标签: sql-server asp.net-mvc entity-framework linq entity-framework-6

我正在使用一个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查询中获得了一些重复的结果。造成这种差异的原因是什么?

2 个答案:

答案 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查询,应该产生相同的结果。