c# - Linq 加入重复记录 c#

标签 c# linq list

我遇到了一个问题,如果有人能提供帮助,我将不胜感激。我有 3 个数据库表中的 3 个列表。账户、联系方式和联系方式。问题是,当我尝试向查询中添加 2 个额外字段时,它会重复记录,例如结果应在列表中包含 700 行,但如果我添加 contact.firstname 和 contact.lastname,则结果为 8000。

每个帐户可以有多个联系人, 每个联系人都有很多联系方式

var Dataset = (from account in ctx.Accounts
from contact in ctx.Contacts
from contactdetails in ctx.ContactDetails.Where(x => x.id == account.id || x.id == 
account.contactdetailsid)

select new { account.id, account.Reference, account.AccountName, contactdetails.Title, 
account.Balance }).Distinct().ToList();

当我更改为以下内容时,我似乎无法弄清楚为什么添加 contact.firstname 和 contact.lastname 会导致重复记录:结果从 700 变为 8000。

select new { account.id, account.Reference, account.AccountName, contactdetails.Title, 
account.Balance, contact.firstname , contact.lastname }).Distinct().ToList();

这没有给出正确的结果

最佳答案

您正在对客户、联系人和联系人详细信息进行外部联接。因此,对于符合您条件的每个帐户、每个联系人、每个 ContactDetail,您最终都会在结果集中得到一个条目。有人试图通过在结果集上抛出 .Distinct() 来解决这个问题,这恰好将结果过滤了一点。但是一旦您从 contact 添加属性,您最终会为查询之前返回的每个对象得到一堆不同的名字和姓氏。

你可能打算做这样的事情:

var Dataset = (from account in ctx.Accounts
from contact in account.Contacts
from contactdetails in contact.ContactDetails
select new { account.id, account.Reference, account.AccountName, contactdetails.Title, 
    account.Balance, contact.firstname , contact.lastname })
.ToList();

更新

如果您没有导航属性,您可以使用 joinwhere 子句获得相同的结果:

var Dataset = (from account in ctx.Accounts
    join contact in ctx.Contacts 
        on account.id equals contact.accountid
    join contactdetails in ctx.ContactDetails 
        on contact.contactdetailsid equals contactdetails.id
    select new { account.id, account.Reference, account.AccountName, contactdetails.Title, 
        account.Balance, contact.firstname , contact.lastname })
.ToList();

……或者……

var Dataset = (from account in ctx.Accounts
    from contact in ctx.Contacts 
    where account.id == contact.accountid
    from contactdetails in ctx.ContactDetails 
    where contact.contactdetailsid == contactdetails.id
    select new { account.id, account.Reference, account.AccountName, contactdetails.Title, 
        account.Balance, contact.firstname , contact.lastname })
.ToList();

这两种方法都应该产生完全相同的执行计划,但 join 子句从语义的角度更好地代表了您的意图。

关于c# - Linq 加入重复记录 c#,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26683289/

相关文章:

c# - 编码结构数组与类

c# - LINQ 查询重用和延迟执行

c# - ASP.NET MVC : Tabs ASCX - Adjust CSS class based on current page?

c# - 是否可以使用 Linq To Entities 访问生成的 SQL

c# - 对象异常的无限循环stackoverflow列表

python - 如何从列表中删除所有特定数据类型?

r - 从列表或R中的向量中提取变量名称

c# - 如何从 C# 中的 CultureTypes 对象获取对值?

c# - 组合键匹配的多个字典

linq - nhibernate 2 linq 急切加载