【问题标题】:c# sqlite inner join时间:2019-04-10 标签:c#sqliteinnerjoin
【发布时间】:2019-06-02 20:30:55
【问题描述】:

我正在 VS2017 中创建一个使用 SQLite 数据库的 Xamarin 跨平台应用程序,并且我正在尝试研究如何使用内部联接执行查询。我正在使用 sqlite-net-pcl NuGet 包。

我使用 DB Browser for SQLite 创建了数据库。我有两张简单的桌子。

class Crime
{
    [PrimaryKey, AutoIncrement]
    public int Id {get; set; }
    [NotNull]
    public string Name { get; set; }
    [NotNull]
    public int Legislation { get; set; }
}

class Legislation
{
    [PrimaryKey, AutoIncrement]
    public int Id { get; set; }
    [NotNull]
    public string Title { get; set; }
}

使用数据库浏览器,我在 Crime.Legislation 上设置了一个外键,链接到 Legislation.Id。

我可以使用下面的代码轻松查询单个表并填充列表。

public partial class LegislationListPage : ContentPage
{
    private SQLiteAsyncConnection _connetion;
    private ObservableCollection<Legislation> _legislations;
    public LegislationListPage ()
    {
        InitializeComponent ();
        _connetion = DependencyService.Get<ISQLiteDb>().GetConnection();
    }

    protected override async void OnAppearing()
    {
        await _connetion.CreateTableAsync<Legislation>();

        var legislations = await _connetion.Table<Legislation>().OrderBy(x => x.Title).ToListAsync();
        _legislations = new ObservableCollection<Legislation>(legislations);
        legislationList.ItemsSource = _legislations;
    }
}

我想在另一个页面上做的是运行一个查询,该查询返回来自犯罪的名称列和来自立法的标题列。

我可以在数据库浏览器的 SQL 中使用

select c.Name, l.Title from Legislation as l inner join Crimes as c on l.Id = c.Legislation

但是我不知道如何使用 c# 来执行此操作,就像我对以前的查询所做的那样。我找不到任何 .join 方法或类似的方法。我希望将结果存储在基于动态创建的类的列表中,但我不确定这是否可能,所以我很高兴创建一个新类来保存两个字符串的结果那将被退回。最终目标只是用结果填充一个列表。

如果有人能指出我正确的方向,那就太好了。

提前致谢。

【问题讨论】:

    标签: c# sqlite inner-join


    【解决方案1】:

    好的,我设法找到了解决方案。真的很简单。我找不到 .join 方法,因为我没有“使用” System.Linq。

    有两种方法。使用查询语法和 lambda。 Lambda 是我希望找到的,所以我很高兴我能成功。

    对于其他在这里寻找类似东西的人来说,我有两种方法

    // First I put both tables into separate lists ( var crimes and var legislation) using the 
    // way shown in my question. Code for that is omitted here
    
    //Query style
    var crimesListItems = from c in crimes
                          join l in legislations on c.Legislation equals l.Id
                          select new { c.Name, l.Title };
    
    // Lambda style
    var crimesListItems = crimes.Join(
              legislations,
              c => c.Legislation,
              l => l.Id,
              (c, l) => new {c.Name, l.Title} );
    

    感谢 Jeremy Clark 和他的教程https://www.youtube.com/watch?v=tzR2qY6S4yw

    【讨论】:

      猜你喜欢
      • 2016-04-19
      • 2022-01-16
      • 2018-07-04
      • 1970-01-01
      • 1970-01-01
      • 2013-05-26
      • 2015-02-10
      • 2013-06-03
      • 2018-09-10
      相关资源
      最近更新 更多