如果我使用Linq to Sql概念与C#语言的数据库进行交互,那么我可能面临哪些挑战?意味着在架构,性能,类型安全,面向对象等方面。!
答案 0 :(得分:1)
基本上,Linq to SQL为数据库中的每个表生成一个类,包含关系属性和所有表,因此您对类型安全没有任何问题。使用C#partials可以为这些对象添加功能,而无需使用Linq to SQLs自动生成的代码。它运作得很好。
当表直接映射到类和对象时,您必须接受您的域层直接镜像数据库设计,或者您必须在Linq to SQL之上构建某种形式的抽象层。对于多对多关系,表格的直接镜像可能特别麻烦,而不是直接支持 - 而不是Orders.Products
得到Order.OrderDetails.SelectMany(od => od.Product)
。
与大多数其他ORM不同,Linq to SQL不仅从数据库中分配对象,而且允许您通过将对象传递回ORM来存储或更新对象。相反,Linq to SQL会跟踪从数据库加载的对象的状态,并允许您更改已保存的状态。理解起来很难解释 - 我建议你阅读一些关于这个主题的Rick Strahls博客文章。
性能明智的Linq-to-SQL做得非常好。在基准测试中,它显示了本机SQL阅读器提供的速度的大约90-95%,根据我的经验,现实世界的使用速度也相当快。像所有ORM一样,Linq to SQL受N + 1选择问题的影响,但它提供了根据上下文指定延迟/急切加载的好方法。
此外,通过选择Linq to SQL,您选择MSSQL - 确实存在允许您连接到其他数据库的第三方解决方案,但是上次我检查时,它们都没有显示出非常完整。
总而言之,Linq to SQL是一个好的,有点容易学习的ORM,它表现还可以。如果您需要Linq to SQL提供的功能,请查看新的实体框架 - 它具有更多功能,但也更复杂。
答案 1 :(得分:1)
我们遇到了一些挑战,主要是将查询构建功能打开给不了解数据库工作方式的程序员。这里有几个气味:
//bad scaling
//Query in a loop - causes n roundtrips
// when c roundtrips could have been performed.
List<OrderDetail> od = new List<OrderDetail>();
foreach(Customer cust in customers)
{
foreach(Order o in cust.Orders)
{
od.AddRange(dc.OrderDetails.Where(x => x.OrderId = o.OrderId));
}
}
//no seperation of
// operations intended for execution in the database
// from operations intended to be executed locally
var query =
from c in dc.Customers
where c.City.StartsWith(textBox1.Text)
where DateTime.Parse(textBox2.Text) <= c.SignUpDate
from o in c.Orders
where o.OrderCode == Enum.Parse(OrderCodes.Complete)
select o;
//not understanding when results are pulled into memory
// causing a full table load
List<Item> result = dc.Items.ToList().Skip(100).Take(20).ToList();
另一个问题是,与表结构的一个更高级别的分离意味着索引更容易被忽略(尽管这是任何ORM的问题)。