Linq查询从两个表中获取不同的记录

3
我有两个表格 - tblExpenses 和 tblCategories,如下所示:

tblExpenses

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

tblCategory

ID (PK),
Name

我尝试了各种LINQ方法来获取上述两个表中的所有不同记录,但并没有取得太多成功。我尝试使用UNION和DISTINCT,但它们没有起作用。
上述两个表在我的项目的模型部分中被定义,这将在SQLite中创建表。我需要检索两个表中的所有不同记录以显示网格视图中的值。
请提供一些输入来完成此任务。我做了一些研究,寻找答案,但似乎没有接近我想要的。如果我重复了这个问题,请原谅我。
以下是我尝试的UNION、DISTINCT方法:

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
如果 union 不起作用,也许你可以尝试使用Linq ZIP和 Distinct。 - jao
主要问题是您创建了笛卡尔积或交叉连接(from exp ... from cat ... select)。 - Gert Arnold
3个回答

3

我想当你联接两个表时,union已经执行了去重操作,你可以尝试像这样:

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

我刚刚尝试了你的方法,但是出现了一个错误,提示'System.Collections.Generic.IEnumerable<SQLiteSample.Models.PurchaseExpense>'不包含“Concat”的定义,而最佳的扩展方法重载'System.Linq.ParallelEnumerable.Concat<TSource>(System.Linq.ParallelQuery<TSource>, System.Collections.Generic.IEnumerable<TSource>)'有一些无效的参数。 - rock
http://msdn.microsoft.com/en-us/library/bb302894.aspx 可能只与Sql Lite相关。 - COLD TOLD

1

由于您也选择了tblExpenses.ID,所以您将始终获得DISTINCT记录。(除非有多个具有相同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 
                 });

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接