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