C# 多次执行.ToList()是个坏主意吗?
我编写了下面的函数来查询Xamarin表单应用程序中的SQLite数据库。但是,由于我必须打两次电话给.ToList(),我对此不是很有信心。这是坏代码吗?如有任何反馈,我们将不胜感激C# 多次执行.ToList()是个坏主意吗?,c#,linq,sqlite,xamarin,C#,Linq,Sqlite,Xamarin,我编写了下面的函数来查询Xamarin表单应用程序中的SQLite数据库。但是,由于我必须打两次电话给.ToList(),我对此不是很有信心。这是坏代码吗?如有任何反馈,我们将不胜感激 public static List<string> GetAllLocationIds() { try { lock (CollisionLock) { //TableQuery&l
public static List<string> GetAllLocationIds()
{
try
{
lock (CollisionLock)
{
//TableQuery<TResult> First .ToList() result
//List<string> Second .ToList() result
return Database.Table<Location>().ToList().Select(loc=>loc.LocationId).ToList();
}
}
catch (Exception ex)
{
Insights.Report(ex);
return null;
}
}
是的
在
它直接作用于
IQueryable
,只具体化LocationId
。假设Table
是IQueryable
的话,你就不能像sqlite-net(-pcl)
那样对string
类型进行Linq投影,因为它需要一个默认的无参数构造函数
下面是我在考虑移动内存和性能时发现的模拟“Linq投影”的“最佳方法”
where
select语句中的过滤器,如果需要)LocationId
列
投影类
SQL选择(仅选择映射到投影类的列)
SQLiteConnection.Query(“从[Location]中选择LocationId”)
现在您有了一个列表
,如果确实需要,您可以将其转换为列表
:
SQLiteConnection.Query<SimpleList>("select LocationId from [Location]").ConvertAll(x => x.LocationId);
SQLiteConnection.Query(“从[Location]中选择LocationId”).ConvertAll(x=>x.LocationId);
值得吗?如果表中有大量的行和/或列,无法使用延迟查询和/或避免Linq投影。。。是的。。。使用探查器确认;-)
如果你有几十排?也许不是,但即使是这样,临时工的数量也会增加。实例化的对象减少了,对我来说,这是移动设备上的一个胜利。使用此方法,您可以完全避免
ToList
。您是否可以改为返回IEnumerable
或IQueryable
?调用方可能希望进一步细化结果。至少,调用方可能需要枚举集合。如果你避免使用ToList
,那么它只能被枚举一次,而不是多次。这里的人们非常热衷于在没有任何解释的情况下否决投票。这个问题无效吗?怎么了?谢谢你的快速回复。我已经试过了。请看编辑后的问题。请看@Heshan。(如果这是您正在使用的库)ToList
可能是一种解决方法,但出于上述原因,它仍然不好。也许你可以使用另一个SqlLite-Linq-Provider。非常感谢@Christian。是的,这就是我正在使用的库..Cast或任何其他在IEnumerable上工作的方法应该可以代替第一个ToList。难道不可能使用匿名类型吗?比如.Select(loc=>new{id=loc.id}).ToList()代码>未意识到错误。匿名类型也有同样的问题。所以它不是一个option@woelliJ不,同样的问题,没有默认构造函数,这只会导致未找到f_uuAnonymousType0``1[[System.String,…
@woelliJsqlite net(-pcl)类型的默认构造函数
是一个非常轻量级的ORM,位于SQLitePCLRaw
之上,它的功能非常强大。您可以全面使用SQLite的MS Entity框架,但它在移动设备上太重(内存和性能方面),我倾向于远离它…@woelliJ这就是框架(v1.1.2)我指的是。Xamarin上有各种各样的问题,对我来说最大的问题是它在资源有限的移动环境中是一个非常沉重的框架,最近由于内存和性能问题被付费从应用程序中删除。现在在服务器(或桌面应用程序)上在x10-x100内存和cpu周期可用的情况下,它是一个伟大的框架,有优秀的开发人员参与其中……但这当然是一种观点。如果您的目标是Xamarin mobile w/it,请在现实世界的低端设备上使用一些现实生活中的数据对其进行分析。
Database.Table<Location>().ToList()
Database.Table<Location>().Select(loc=>loc.LocationId).ToList();
class Location
{
[PrimaryKey]
public int Column1 { get; set; }
public int Column2 { get; set; }
~~~
public string LocationId { get; set; }
}
class SimpleList
{
public string LocationId { get; set; }
}
SQLiteConnection.Query<SimpleList>("select LocationId from [Location]")
SQLiteConnection.Query<SimpleList>("select LocationId from [Location]").ConvertAll(x => x.LocationId);