首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何从连接的多个表中仅获取不同的值

如何从连接的多个表中仅获取不同的值
EN

Stack Overflow用户
提问于 2020-07-06 18:53:33
回答 1查看 40关注 0票数 0

Here i want to show only distict values

代码语言:javascript
复制
var projects = (from dtid in db.Types.Where(dtid => dtid.Site == 1)
                    join diid in di on dtid.TypeId equals diid.TypeId
                    join dicid in dic on diid.DonationId equals dicid.DonationId
                    join eeid in ee.Where(eeid => eeid.IsActive == true) on dicid.ExEnId equals eeid.ExEnId
                    join cid in c on eeid.CoId equals cid.CoId
                    where dtid.DonationTypeId == id                             

                    select new Newmodel
                    {
                        countries = cid,
                        exEn = eeid,
                        donationItemCountries = dicid,
                        donation = diid,
                        types = dtid                               

                    }).Distinct().ToList().Take(100) ;

return View(projects);

我有一个包含一些相关数据的多表,我只想使用.NET核心实体框架向视图显示唯一的国家/地区,下面是代码。

模型

代码语言:javascript
复制
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
using System.Web;
using System.Collections;
using System.ComponentModel.DataAnnotations;
using System.ComponentModel.DataAnnotations.Schema;

namespace website.Models

{
    public class Newmodel
    {

        public Types types { get; set; }
        public Donation donation { get; set; }
        public DonationCountries donationCountries { get; set; }
        public ExEn exEn { get; set; }
        public Countries countries { get; set; }


    }
}
EN

回答 1

Stack Overflow用户

发布于 2020-07-06 19:10:11

通过什么不同的比较?在不使用和IEqualityComparer的情况下调用Distinct()的作用与通常使用==时的作用相同,这意味着它会检查引用是否相等。我猜你想要通过国家名称或国家id进行比较,这意味着你需要一个自定义的IEqualityComparer,幸运的是它们很容易实现:

代码语言:javascript
复制
class NewmodelEqualityComparer : IEqualityComparer<Newmodel>
{
    public bool Equals(Newmodel n1, Newmodel n2)
    {
        // Replace '.countries' with whatever property you want to compare
        return n1.countries == n2.countries;
    }

    public int GetHashCode(Newmodel n)
    {
        return n.GetHashCode()
    }
}

然后,您对Distinct的调用需要简单地将其作为其相等比较器进行传递,如下所示:

代码语言:javascript
复制
.Distinct(new NewmodelEqualityComparer()).Take(100).ToList();

注意我是如何切换TakeToList的位置的,这是因为如果你先ToList,然后Take 100,整个底层的原始列表将被处理,然后100将被取。我们可以通过先取100,然后将底层集合转换为list来提高效率,这样可能会节省数千次对Distinct的调用。这要归功于IEnumerable和LINQ提供的deferred execution

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62754542

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档