我已经写了很多代码,它使用我提供给我的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)));
上面的两个查询都给出了相同的结果,但在性能和可测试性方面比一个更好?
答案 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和相关的实体属性设置器以便将它们同步,但在您知道之前,您将实现内存数据库!