.ToListAsync() 在 .net8 maui android 应用程序中可用吗?

问题描述 投票:0回答:1

我正在开发 .net maui android 应用程序。

我有8000条记录这样的大数据。 当客户安装应用程序时,我将数据保存在 SQLite 数据库中一次,然后从数据库中检索以过滤数据。 我想等待查询,但我只看到 .ToList() 因为应用程序抛出空异常并崩溃。 ToListAsync() 在 .net8 maui android 应用程序中可用,或者我如何通过 linq 等待结果?

这是我的数据上下文类代码

public class DataContext
{
    private const string DbName = "IdealDiagnosisDb3";
    public static string DbPath = Path.Combine(FileSystem.Current.AppDataDirectory,DbName);
    private SQLiteConnection Database;

    private async Task init()
    {
        //File.Delete(DbPath);

        if (File.Exists(DbPath))
        {
            return;
        }

        Database = new SQLiteConnection(DbPath, SQLiteOpenFlags.Create | SQLiteOpenFlags.ReadWrite | SQLiteOpenFlags.SharedCache);
            
        Database.CreateTable<Drug>();
        List<Drug> drugs = new List<Drug>(){big data };

        foreach (Drug drug in drugs)
        {
            Database.Insert(drug);
        }

        Database.CreateTable<TradeDrug>();
        List<TradeDrug> TradeDrugs = new List<TradeDrug>(){ big data };
        foreach (TradeDrug TradeDrug in TradeDrugs)
        {
            Database.Insert(TradeDrug);
        }
    }
        
    public async Task<List<Drug>> LoadAllDrugsAsync()
    {
        init();
        return Database.Table<Drug>().ToList();
    }

    public async Task<List<TradeDrug>> LoadAllTradeDrugsAsync()
    {
        init();
        return Database.Table<TradeDrug>().ToList();
    }
}

这是我的 HomeViewModel 类代码

public partial class HomeVM(DataContext dataContext) : BaseVM
{
    private readonly DataContext _dataContext = dataContext;

    [ObservableProperty]
    private List<Drug> _drugs;

    [ObservableProperty]
    private List<TradeDrug> _tradeDrugs;

    private List<Drug> DrugsWithoutFilter;

    private List<TradeDrug> TradeDrugsWithoutFilter;

    [ObservableProperty]
    private string _searchName;

    [ObservableProperty]
    private string _placeHolderText;

    [ObservableProperty]
    private string _drugName;

    [ObservableProperty]
    private string _diagnosisId;

    [ObservableProperty]
    private string _diagnosisName;

    [ObservableProperty]
    private bool _isDrugSelected;

    [ObservableProperty]
    [NotifyCanExecuteChangedFor(nameof(SearchCommand))]
    private bool _isTradeRadioButtonChecked;

    partial void OnIsTradeRadioButtonCheckedChanged(bool value)
    {
        Search();
    }

    [ObservableProperty]
    private Drug _selectedDrug;

    [ObservableProperty]
    private int _countDrugs;

    public async Task InitializeDrugsAsync() 
    {
        DrugsWithoutFilter = await _dataContext.LoadAllDrugsAsync();

        Drugs = DrugsWithoutFilter;
        CountDrugs = Drugs.Count();
        TradeDrugsWithoutFilter = await _dataContext.LoadAllTradeDrugsAsync();

        TradeDrugs = TradeDrugsWithoutFilter;

        IsDrugSelected = false;
        IsTradeRadioButtonChecked = false;
    }

    [RelayCommand]
    private async Task Search()
    {
        if (!IsTradeRadioButtonChecked)
        {
            PlaceHolderText = "Enter Active Ingredient";

            if (!string.IsNullOrEmpty(SearchName))
            {
                IsBusy = true;
                Drugs = DrugsWithoutFilter.Where(x => x.DrugName.ToLower().Contains(SearchName.ToLower())).ToList();

                CountDrugs = Drugs.Count();
                IsBusy = false;
            }
            else
            {
                Drugs = DrugsWithoutFilter;

                CountDrugs = Drugs.Count();
            }
        }
        else
        {
            PlaceHolderText = "Enter Trade Name";

            if (!string.IsNullOrEmpty(SearchName))
            {
                IsBusy = true;
                TradeDrugs = TradeDrugsWithoutFilter.Where(x => x.TradeDrugName.ToLower().Contains(SearchName.ToLower())).ToList();

                CountDrugs = TradeDrugs.Count();
                IsBusy = false;
            }
            else
            {
                TradeDrugs = TradeDrugsWithoutFilter;

                CountDrugs = TradeDrugs.Count();
            }
        }
    }
}

错误 intellesense 建议中没有 .tolistasync()

c# android .net async-await maui
1个回答
0
投票

ToListAsync()
EntityFramework 包/dll 的一部分。但我在您的代码中没有看到任何
EntityFramework
引用。所以我认为你不能使用它。

但是你可以将代码切换为:

 private void Init() 
 { 
      // your code here
 }

或者(开销很小,因为

async/await
实际上没有必要)

 private async Task Init() 
 { 
     // your code here

     // at the end
     await Task.CompletedTask;
 }

或者(同样是一点开销)

 private Task Init() 
 { 
     // your code here

     return Task.FromResult(yourResult);
 }
© www.soinside.com 2019 - 2024. All rights reserved.