Linq:加入或不加入(这是更好的方式,加入或关系)

时间:2010-07-22 17:01:51

标签: c# linq-to-sql join foreign-key-relationship

我已经写了很多代码,它使用我提供给我的Linq2Sql表关系,只是在我的数据库上有外键。但是,对我的单元测试模拟数据证明这有点费力。我必须在我的测试工具中手动设置任何关系。

所以,我想知道如果写Linq加入而不是依赖关系会给我更容易测试和可能更高效的代码。

        var query =
            from orderItem in data.OrderItems
            select new
            {
                orderItem.Order.Reference,
                orderItem.SKU,
                orderItem.Quantity,
            };

        Console.WriteLine("Relationship Method");
        query.ToList().ForEach(x => Console.WriteLine(string.Format("Reference = {0}, {1} x {2}", x.Reference, x.Quantity, x.SKU)));

        var query2 =
            from orderItem in data.OrderItems
            join order in data.Orders
                on orderItem.OrderID equals order.OrderID
            select new
            {
                order.Reference,
                orderItem.SKU,
                orderItem.Quantity,
            };

        Console.WriteLine();
        Console.WriteLine("Join Method");
        query2.ToList().ForEach(x => Console.WriteLine(string.Format("Reference = {0}, {1} x {2}", x.Reference, x.Quantity, x.SKU)));

上面的两个查询都给出了相同的结果,但在性能和可测试性方面比一个更好?

3 个答案:

答案 0 :(得分:2)

你在测试什么? Linq to SQL的数据读取能力?通常假设linq to sql是数据库上的薄单板,linq to sql代码本身被认为是“原始的”,因此不需要进行测试。

我非常不赞成以这种方式使代码复杂化,只是为了你可以模拟linq到sql DBML。如果要测试业务逻辑,最好将测试数据库连接到DBML(datacontext的构造函数重载允许您执行此操作)并使用数据库事务来测试数据交互。这样,您可以回滚事务以撤消对数据库的更改,使测试数据库保持其原始状态。

答案 1 :(得分:1)

就性能而言,两个查询都将评估为相同的SQL(Scott Guthrie有一个关于如何查看LINQ查询生成的SQL的blog post。我认为这两种选择本身都不比另一种更“可测试”。但是,我更喜欢使用外键和关系,因为在使用SQL Metal时,它可以让您快速了解数据库是否具有相应的键。

答案 2 :(得分:1)

我认为这两种方法在性能可测试性方面都没有优势。第一种形式更容易阅读,所以我个人会这样做。这是一个主观问题。

在我看来,您的问题在于能够以简单的方式设置数据,并且外键值和实体引用保持一致。我认为这不是一个容易解决的问题。您可以编写某种类型的框架来创建对象代理并使用实体元数据拦截FK和相关的实体属性设置器以便将它们同步,但在您知道之前,您将实现内存数据库!