Linq 查询从两个表中获取不同的记录
Posted
技术标签:
【中文标题】Linq 查询从两个表中获取不同的记录【英文标题】:Linq Query to Get Distinct Records from Two Tables 【发布时间】:2013-01-09 03:29:18 【问题描述】:我有两个表 - tblExpenses 和 tblCategories 如下
tbl费用
ID (PK),
Place,
DateSpent,
CategoryID (FK)
tblCategory
ID (PK),
Name
我尝试了各种 LINQ 方法来从上述两个表中获取所有不同的记录,但没有取得多大成功。我尝试使用 UNION 和 DISTINCT,但没有成功。
以上两个表是在我的项目的模型部分中定义的,这反过来将在 SQLite 中创建表。我需要从两个表中检索所有不同的记录以在 gridview 中显示值。
请为我提供一些输入以完成此任务。我做了一些研究来找到这个问题的答案,但似乎没有什么接近我想要的。如果我重复了这个问题,请原谅。
这是我尝试过的 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 时出错
【问题讨论】:
向我们展示您对 UNION 和 DISTINCT 的尝试,因为这是正确的路径。 如果 union 不起作用,也许你可以试试 Linq ZIP 和 Distinct 主要问题是您创建了笛卡尔积或交叉连接 (from exp ... from cat ... select
)。
【参考方案1】:
我认为当你加入两个表时,union 已经做了不同的事情,你可以尝试类似的东西
var query=(from c in db.tblExpenses select c).Concat(from c in
db.tblCategory select c).Distinct().ToList();
【讨论】:
我刚试过你的方法。我收到一条错误消息,提示“System.Collections.Generic.IEnumerable您将始终获得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
);
【讨论】:
【参考方案3】:您可以尝试以下查询: 像这样的 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
【讨论】:
以上是关于Linq 查询从两个表中获取不同的记录的主要内容,如果未能解决你的问题,请参考以下文章