Linq对dot net中sql概念的挑战

时间:2010-09-04 07:22:07

标签: linq-to-sql

如果我使用Linq to Sql概念与C#语言的数据库进行交互,那么我可能面临哪些挑战?意味着在架构,性能,类型安全,面向对象等方面。!

2 个答案:

答案 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的问题)。