2013-01-25 57 views
3

獲取不重複的記錄,我有兩個表 - tblExpenses和tblCategories如下LINQ查詢從兩個表中

tblExpenses

ID (PK), 
Place, 
DateSpent, 
CategoryID (FK) 

tblCategory

ID (PK), 
Name 

我嘗試過各種LINQ方法來獲取所有上述兩張表格中有不同的記錄,但沒有取得太大的成功。我嘗試使用UNION和DISTINCT,但它沒有奏效。

上述兩個表在我的項目的模型部分中定義,這些部分反過來將在SQLite中創建表。我需要從兩個表中檢索所有不同的記錄以在gridview中顯示值。

請提供一些輸入來完成此任務。我做了一些研究來找到這個問題的答案,但沒有什麼東西接近我想要的。對不起,如果我重複了這個問題。

這裏是UNION,不同的方法我試過:

DISTINCT#==>讓我重複值

(from exp in db.Table<tblExpenses >() 
            from cat in db.Table<tblCategory>()          
            select new { exp.Id, exp.CategoryId, exp.DateSpent, exp.Expense, exp.Place, cat.Name }).Distinct(); 

UNION#在使用UNION

+1

讓我們瞭解您嘗試與UNION和DISTINCT因爲這是正確的道路。 – leppie

+0

如果工會不工作,也許你可以試試[Linq ZIP](http://weblogs.thinktecture.com/cnagel/2010/02/linq-with-net-4-zip.html)和Distinct – jao

+0

主要問題是你創建了一個Cartesian Product或交叉連接('from exp ... from cat ... select')。 –

回答

3

我==>得到了一個錯誤認爲工會已經做到了這一點,當你加入兩張桌子時,你可以嘗試一些事情,如

var query=(from c in db.tblExpenses select c).Concat(from c in 
      db.tblCategory select c).Distinct().ToList(); 
+0

我剛試過你的方法。我收到一個錯誤,說'System.Collections.Generic.IEnumerable '不包含'Concat'的定義和最佳擴展方法重載'System.Linq.ParallelEnumerable.Concat (System.Linq。 ParallelQuery ,System.Collections.Generic.IEnumerable )'有一些無效參數 – rock

+0

http://msdn.microsoft.com/en-us/library/bb302894.aspx可能只是與sql lite相關 –

0

你可以試試這個查詢:

一個SELECT DISTINCT這樣的查詢:

SELECT DISTINCT Name FROM tblCategory INNER JOIN tblExpenses ON tblCategory.categoryID = tblExpenses.categoryID; 

將結果限制爲唯一值的輸出字段。查詢結果不可更新。



一個SELECT DISTINCTROW這樣的查詢:

SELECT DISTINCTROW Name FROM tblCategory INNER JOIN tblExpenses ON tblCategory.categoryID = tblExpenses.categoryID;<br/><br/> 

着眼於整個基礎表,不只是輸出領域,找到獨特的行。

參考:http://www.fmsinc.com/microsoftaccess/query/distinct_vs_distinctrow/unique_values_records.asp

1

你總是會得到DISTINCT記錄,因爲你選擇tblExpenses.ID了。 (除非有多個類別具有相同的ID,但是這當然是真的,真的很糟糕的設計。

記住,使得在LINQ一個JOIN時,字段名和數據類型應該是相同的。字段tblExpenses.CategoryID是可爲空的字段嗎?

如果是的話,試試這個JOIN

db.Table<tblExpenses>() 
.Join(db.Table<tblCategory>(), 
     exp => new { exp.CategoryId }, 
     cat => new { CategoryId = (int?)cat.ID }, 
     (exp, cat) => new { 
          exp.Id, 
          exp.CategoryId, 
          exp.DateSpent, 
          exp.Expense, 
          exp.Place, 
          cat.Name 
         }) 
.Select(j => new { 
        j.Id, 
        j.CategoryId, 
        j.DateSpent, 
        j.Expense, 
        j.Place, 
        j.Name 
       });