簡體   English   中英

使用LINQ檢索數據

[英]Retrieving data using LINQ

因為幾個晚上我一直堅持這個問題。 我的應用程序中有SQLite數據庫。 我從一個文件創建了SQLite DB。 ERD圖如下所示: 在此輸入圖像描述

現在,在我的應用程序中,我創建了與數據庫的連接:

using (var conn = new SQLiteConnection(DB_PATH))
{
    // retrieving statemets...
}

我創建了代表我的數據庫中的表的類:

public class Kantory
{
        public Kantory()
        {
            this.kursy = new HashSet<Kursy>();
        }

        [SQLite.PrimaryKey, SQLite.AutoIncrement]
        public int id_kantory { get; set; }
        public string nazwa { get; set; }

        public virtual ICollection<Kursy> kursy { get; set; }
}

public class Waluty
{
        public Waluty()
        {
            this.kursy = new HashSet<Kursy>();
        }

        [SQLite.PrimaryKey, SQLite.AutoIncrement]
        public int id_waluty { get; set; }
        public string nazwa { get; set; }

        public virtual ICollection<Kursy> kursy { get; set; }
}

public class Kursy
{
        [SQLite.PrimaryKey, SQLite.AutoIncrement]
        public int id_kursy { get; set; }
        public int id_kantory { get; set; }
        public int id_waluty { get; set; }
        public decimal kurs { get; set; }
        public System.DateTime data { get; set; }
        public int aktualne { get; set; }

        public virtual Kantory kantory { get; set; }
        public virtual Waluty waluty { get; set; }
}

如你所見,在kursy表中我有兩個外鍵 - id_kantoryid_waluty

現在非常好奇和奇怪的事情發生了 當我嘗試使用INNER JOIN語句使用普通SQL狀態檢索一些信息時 - 它工作正常:

using (var conn = new SQLiteConnection(DB_PATH))
{
    var query = new SQLiteCommand(conn);
    query.CommandText = "SELECT * FROM Kursy INNER JOIN Kantory ON Kursy.id_kursy=Kantory.id_kantory WHERE Kantory.id_kantory = 1";
    var result = query.ExecuteQuery<Kursy>();
}

這段代碼工作正常! 但是當我嘗試使用LINQ這樣的類時:

using (var conn = new SQLiteConnection(DB_PATH))
{
    var result = conn.Table<Kursy>().Where(k => k.kantory.id_kantory == 1).FirstOrDefault();
}

它拋出了一個NotSupportedException! 消息是: 成員訪問無法編譯表達式

但是,當我使用LINQ WITHOUT JOINING另一個類時,我使用我的類它可以工作:

using (var conn = new SQLiteConnection(DB_PATH))
{
        var result = conn.Table<Kursy>().Where(k => k.id_kursy == 1).FirstOrDefault();
}

所以最后:我的主要問題是我無法使用LINQ查詢加入更多的那個表 似乎這個模型在課堂上是錯誤的,但我真的不知道為什么......

PS。 這是Windows Phone 8.1應用程序 ,因此我無法使用Entity Framework。

這是有效的代碼。 它僅使用EntityFramework 6.3.1而不使用任何SQLite特定程序集。

我明白你不想使用實體框架。 要想為此添加答案,我們需要知道您正在使用的SQLite特定程序集。 例如,你在使用DbLinq嗎?

具體來說,哪些組件包含以下方法?

  • SQLiteCommand.ExecuteQuery<T>()
  • SQLiteConnection.Table<T>()

無論如何,這里是與Entity Framework一起使用的代碼。

using System;
using System.Linq;
using System.Data.Entity;
using System.Collections.Generic;
using System.ComponentModel.DataAnnotations;

namespace SQLite
{
    class Program
    {
        static void Main(string[] args)
        {
            using (var conn = new SQLiteConnection(@"C:\linqToSqlite.db"))
            {
                SeedEntities(conn);

                // this is the query that DID work for you
                var result1 = conn.Kursy
                    .Where(k => k.id_kursy == 1)
                    .FirstOrDefault();

                Console.WriteLine(
                    string.Format("id_kursy:{0}", result1.id_kursy));

                // this is the query that did NOT work for you
                // it does work here
                var result2 = conn.Kursy
                    .Where(k => k.kantory.id_kantory == 1)
                    .FirstOrDefault();

                Console.WriteLine(
                    string.Format("id_kursy:{0}", result2.id_kantory));
            }

            Console.ReadKey();
        }

        private static void SeedEntities(SQLiteConnection conn)
        {
            SeedEntities(conn);
            // make sure two entities exist with the appropriate ids
            if (!conn.Kantory.Any(x => x.id_kantory == 1))
            {
                conn.Kantory
                    .Add(new Kantory() { id_kantory = 1 });
            }

            if (!conn.Kursy.Any(x => x.id_kantory == 1))
            {
                conn.Kursy
                    .Add(new Kursy() { id_kantory = 1 });
            }

            conn.SaveChanges();
        }        
    }

    public class SQLiteConnection : DbContext
    {
        public SQLiteConnection(string connString) : 
            base(connString) {}
        public DbSet<Kantory> Kantory { get; set; }
        public DbSet<Kursy> Kursy { get; set; }
    }

    public class Kantory
    {
        public Kantory()
        {
            this.kursy = new HashSet<Kursy>();
        }

        [Key]
        public int id_kantory { get; set; }
        public virtual ICollection<Kursy> kursy { get; set; }
    }

    public class Kursy
    {
        [Key]
        public int id_kursy { get; set; }
        public int id_kantory { get; set; }
        public virtual Kantory kantory { get; set; }
    }
}

我擔心我使用了與你不同的技術,因為我不知道你使用的確切裝配。 例如,不清楚您用於Table<T>()方法的程序集。 所以,我使用了DbContext.Kursy方法而不是以下引用:

  • EntityFramework.dll
  • EntityFramework.SqlServer.dll
  • System.dll
  • System.ComponentModel.DataAnnotations.dll

換句話說,它僅適用於EntityFramework 6.1.3,並且不需要任何特定於SQLite程序集。

對於與您的需求相關的答案,您引用了哪些SQLite特定參考?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM