Linq to sql 网络中Linq到sql概念的挑战

Linq to sql 网络中Linq到sql概念的挑战,linq-to-sql,Linq To Sql,假设我使用Linq到Sql的概念从C#语言与数据库交互,那么我可能会面临什么挑战?在体系结构、性能、类型安全、面向对象等方面的方法 基本上,linqtosql为数据库中的每个表生成一个类,包含关系属性和所有属性,因此类型安全性不会有问题。使用C#partials允许您向这些对象添加功能,而无需使用Linq到SQLs自动生成的代码。它工作得很好 由于表直接映射到类和对象,您要么必须接受域层直接反映数据库设计,要么必须在Linq到SQL之上构建某种形式的抽象层。对于不直接支持的多对多关系,表的直接镜

假设我使用Linq到Sql的概念从C#语言与数据库交互,那么我可能会面临什么挑战?在体系结构、性能、类型安全、面向对象等方面的方法

基本上,linqtosql为数据库中的每个表生成一个类,包含关系属性和所有属性,因此类型安全性不会有问题。使用C#partials允许您向这些对象添加功能,而无需使用Linq到SQLs自动生成的代码。它工作得很好

由于表直接映射到类和对象,您要么必须接受域层直接反映数据库设计,要么必须在Linq到SQL之上构建某种形式的抽象层。对于不直接支持的多对多关系,表的直接镜像可能特别麻烦-而不是
Orders.Products
您可以获得
Order.OrderDetails.SelectMany(od=>od.Product)

与大多数其他ORM不同,LINQtoSQL不仅仅从数据库中分配对象,还允许您通过将对象传递回ORM来存储或更新对象。相反,Linq to SQL跟踪从数据库加载的对象的状态,并允许您更改保存的状态。这很难解释,也很难理解——我建议你读一些里克·斯特拉尔关于这个主题的博客文章

性能方面的LINQtoSQL做得很好。在基准测试中,它显示的速度约为原生SQL阅读器的90-95%,根据我的经验,真实世界的使用速度也相当快。与所有ORMs一样,Linq to SQL也会受到N+1选择问题的影响,但它提供了根据上下文指定延迟/急切加载的好方法

此外,通过选择Linq to SQL,您可以选择MSSQL—确实存在允许您连接到其他数据库的第三方解决方案,但上次我检查时,没有一个解决方案看起来非常完整


总而言之,LINQtoSQL是一种很好的、易学的ORM,它的性能很好。如果您需要超出Linq to SQL所提供的功能,请查看新的实体框架—它有更多的功能,但也更复杂。

我们遇到了一些挑战,主要是向不了解数据库如何工作的程序员开放查询构造功能。以下是一些气味:

//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();
//缩放错误
//循环中的查询-导致n次往返
//当可以执行c往返时。
列表od=新列表();
foreach(客户中的客户)
{
foreach(客户订单中的订单o)
{
AddRange(dc.OrderDetails.Where(x=>x.OrderId=o.OrderId));
}
}
//不分离
//要在数据库中执行的操作
//来自拟在本地执行的操作
变量查询=
来自dc的c.客户
其中c.City.StartsWith(textBox1.Text)
其中DateTime.Parse(textBox2.Text)