是使用linq2sql为存储过程生成类更好,还是直接调用存储过程更好?
本文关键字:更好 存储过程 调用 linq2sql | 更新日期: 2023-09-27 18:09:47
我看到很多关于LINQ to SQL vs . Stored process的问题。我更好奇的是,在对象映射中串联使用它们的好处。
我已经定义了业务对象,并且为所有CRUD事务定义了存储过程。
是将所有存储过程放入一个DBML文件中并从那里调用它们,然后将结果映射到我的业务对象,还是使用DataReader并从那里映射它更好?
这对我来说很烦人,因为我想要我的对象,因为我定义他们,而不是使用MyStoredProcResult对象作为linq2sql生成,所以我觉得我正在做相同的字段逐字段映射,我将与数据阅读器。
性能在这里不一定是关键(除非它慢得离谱)。我希望为所有开发人员创建一个标准的方式,以最简单的方式从数据库加载数据到对象与最少的代码。
映射到LINQ2SQL在类型安全方面有一个重要的优势—您不必真正担心解析结果或添加命令参数。它会为你做这一切。
另一方面,使用SQLcommand和DataReader直接调用存储过程被证明具有更好的性能(特别是在读取/更改大量数据时)。
无论你选择哪一个,最好是建立一个单独的数据访问层,因为它允许更多的灵活性。访问/更改数据库的逻辑不应该内置到您的业务对象中,因为如果您被迫更改存储数据的方式,那么更新软件将是痛苦的。
不是直接回答您的问题,但是如果您希望您的对象作为查询的结果,您可能必须考虑代码优先模式。Linq2SQL不支持这个,但是实体框架和NHibernate支持。
直接的答案是DataReader显然会有更少的开销,但同时它会有更多的魔法字符串。开销在性能方面很糟糕(在您的情况下不是那么大)。魔术字符串在维护代码方面很糟糕。所以这当然是你个人的选择
LINQ2SQL可以提供用查询结果填充的对象。您必须以这样一种方式构建子对象,以支持List(Of T)或List,这取决于您选择的语言。
假设您有一个包含ID、Company Name和Phone Number字段的表。在LINQ或存储过程中查询该表非常简单。LINQ带来的优势是能够将结果映射到匿名类型或您自己的类。所以查询:
var doSomething = from sList in myTableRef select sList;
将返回一个匿名类型。但是,如果您也有这样的类:
public class Company
{
public integer ID;
public string Company;
public string PhoneNumber;
}
将您的查询更改为以下格式将在它遍历数据时填充Company对象:
List<Company> companies = (from sList in myTableRef select new Company
{ .ID = sList.id,
.Company = sList.company,
.PhoneNumber = sList.phonenumber }).ToList();
我的c#语法可能不是100%正确,因为我主要在VB中编写代码,但它将足够接近,让你在那里。