所以我现在已经使用 Entity + LINQ 进行开发一段时间了,我真的开始想知道最佳实践。我习惯了“如果我需要获取数据,则引用存储过程”的模型。如果需要,可以动态更改存储过程,并且不需要重新编译代码。我发现我的代码中的查询如下所示:
List<int> intList = (from query in context.DBTable
where query.ForeignKeyId == fkIdToSearchFor
select query.ID).ToList();
我开始想知道这个和这个有什么区别:
List<int> intList = SomeMgrThatDoesSQLExecute.GetResults(
string.Format("SELECT [ID]
FROM DBTable
WHERE ForeignKeyId = {0}",
fkIdToSearchFor));
我担心的是,我本质上是将查询硬编码到代码中。我错过了什么吗?这就是实体的意义吗?如果我需要做任何实际的查询工作,我应该把它放在存储过程中吗?
直到您需要更复杂的查询时,Linq 的强大功能才真正显现出来。
在您的示例中,请考虑如果您想对查询应用某种形式的过滤器,您需要做什么。使用字符串构建的 SQL,您必须将值附加到字符串生成器中,以防止 SQL 注入(或者花费额外的精力来准备带有参数的语句)。
假设您想向 linq 查询添加一条语句;
IQueryable<Table> results = from query in context.Table
where query.ForeignKeyId = fldToSearchFor
select query;
你可以接受并做到这一点;
results.Where( r => r.Value > 5);
生成的 sql 看起来像这样;
SELECT * FROM Table WHERE ForeignKeyId = fldToSearchFor AND Value > 5
在枚举结果集之前,您想要装饰的任何额外条件都会为您添加,从而以更加灵活和强大的方式进行动态查询。我使用这样的方法在列表上提供过滤器。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)