2012-03-12 72 views
0

我想用Simple.Data做一個簡單的連接,但我無法使它工作。我敢肯定,我失去了一些東西,但我不明白這一點...Simple.Data框架:連接不起作用

SQL:

CREATE TABLE TestA 
(
    ID INTEGER PRIMARY KEY, 
    Txt TEXT 
); 

CREATE TABLE TestB 
(
    ID INTEGER PRIMARY KEY, 
    Aref INTEGER, 
    Txt TEXT, 

    FOREIGN KEY(Aref) REFERENCES TestA(ID) 
); 

INSERT INTO TestA 
VALUES (1, 'This is Test A!'); 

INSERT INTO TestB 
VALUES (1, 1, 'This is TestB!'); 

C#:

db.TestB.Find(db.TestB.Aref = db.TestA.ID); 

如果我運行代碼,我會得到一個RuntimeBinderException:'Simple.Data.ObjectReference'不包含'Aref'的定義。

我使用Simple.Data.Core /阿土v0.12.2.2和Simple.Data.Sqlite v0.12.2.4

我已經檢查了Docs,但我看不到我的錯誤。我做錯了什麼?

編輯: 我也試過指數風格:

db["TestB"].Find(db["TestB"]["TestA"]["ID"] == db["TestB"]["Aref"]); 

生成的SQL是這樣的:

select [TestB].* from [TestB] JOIN [TestA] ON ([TestA].[Aref] = [TestB].[ID]) where [TestA].[ID] = [TestB].[Aref] 

好像是在ON部分的表被反轉,實際上它應該像WHERE部分...

+0

我認爲你的操作員是錯誤的。根據文檔,它應該是'==' – MilkyWayJoe 2012-03-12 20:57:56

+0

@MilkyWayJoe是的,你是對的。如果我使用==運算符,則會得到不同的異常,AdoAdapterException:「SQLite錯誤 no such column:TestA.ID」。 生成的SQL代碼:。選擇[TESTB] *從[TESTB],其中[TESTB] [阿里夫] = [特斯塔] [ID] – MBulli 2012-03-12 21:09:25

+0

你有一個DB客戶端,可以在其中運行生成的選擇?如果你不這樣做,請下載並嘗試在那裏執行它。如果它有效,那麼也許它是一個錯誤。也許你可以嘗試更新你的項目模型(有時,在極端的情況下,我刪除我的對象,並再次創建它們) – MilkyWayJoe 2012-03-13 05:09:51

回答

0

試試這個:

using(var db = new MyEntities()) 
{ 
    var sql = db.TestB.Include("TestA"); 
    var data = sql.ToList(); 

    //the var data will now contain the queried data. 
    //you could bind the var to a datagrid. 

    //WPF datagrid 
    MydataGrid.DataContext = data; 

    //Asp.net datagrid 
    MyDatagrid.DataSource = data; 
    MyDatagrid.DataBind(); 

    //Or loop thru the results 
    foreach(var item in data) 
    { 
     MessageBox.Show("Column -> " + item.ColumnName); 
    } 


} 
+0

此代碼返回一個Simple.Data.FunctionReference對象。我如何從這個對象接收數據? – MBulli 2012-03-12 21:13:41

+0

看到我上面修改的答案。這假設你已經創建了一個EDMX並且這些實體是相關聯的。 – Jerry 2012-03-14 13:18:48

0
 List<TestB> source = db.TestB.FindAll() 
      .Select(db.TestB.ID, 
      db.TestB.Aref, 
      db.TestB.Txt, 
      db.TestB.TestA.ID, 
      db.TestB.TestA.Txt) 
      .Join(db.TestA).On(db.TestA.ID == db.TestB.Aref); 

本示例從表TestB獲取所有記錄。你可以在章節選擇中選擇你想要的列。 我希望這對你有所幫助。