Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/285.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 多次执行.ToList()是个坏主意吗?_C#_Linq_Sqlite_Xamarin - Fatal编程技术网

C# 多次执行.ToList()是个坏主意吗?

C# 多次执行.ToList()是个坏主意吗?,c#,linq,sqlite,xamarin,C#,Linq,Sqlite,Xamarin,我编写了下面的函数来查询Xamarin表单应用程序中的SQLite数据库。但是,由于我必须打两次电话给.ToList(),我对此不是很有信心。这是坏代码吗?如有任何反馈,我们将不胜感激 public static List<string> GetAllLocationIds() { try { lock (CollisionLock) { //TableQuery&l

我编写了下面的函数来查询Xamarin表单应用程序中的SQLite数据库。但是,由于我必须打两次电话给.ToList(),我对此不是很有信心。这是坏代码吗?如有任何反馈,我们将不胜感激

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投影”的“最佳方法”

  • 仅对需要投影的列使用自定义类
  • 使用SQL查询,只对映射到该自定义类所需的列进行查询(
    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,…
    @woelliJ
    sqlite 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);