时间:2019-04-10 标签:c#sqliteinnerjoin

Posted

技术标签:

【中文标题】时间:2019-04-10 标签:c#sqliteinnerjoin【英文标题】:c# sqlite inner join 【发布时间】: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 方法或类似的方法。我希望将结果存储在基于动态创建的类的列表中,但我不确定这是否可能,所以我很高兴创建一个新类来保存两个字符串的结果那将被退回。最终目标只是用结果填充一个列表。

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

提前致谢。

【问题讨论】:

【参考方案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

【讨论】:

以上是关于时间:2019-04-10 标签:c#sqliteinnerjoin的主要内容,如果未能解决你的问题,请参考以下文章

时间:2019-04-10 标签:c#sqldataadapterparams in using

时间:2019-04-10 标签:c++win32SendInput()

时间:2019-04-10 标签:c#httpclient post force single packet

检索在 sqlite 数据库中插入的所有行,并在包含标签的表视图单元格中显示为具有不同部分的子视图

SQLite,多对多关系,如何聚合?

通过 sqlite 根据特定条件获取行号