Here i want to show only distict values
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核心实体框架向视图显示唯一的国家/地区,下面是代码。
模型
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; }
}
}发布于 2020-07-06 19:10:11
通过什么不同的比较?在不使用和IEqualityComparer的情况下调用Distinct()的作用与通常使用==时的作用相同,这意味着它会检查引用是否相等。我猜你想要通过国家名称或国家id进行比较,这意味着你需要一个自定义的IEqualityComparer,幸运的是它们很容易实现:
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的调用需要简单地将其作为其相等比较器进行传递,如下所示:
.Distinct(new NewmodelEqualityComparer()).Take(100).ToList();注意我是如何切换Take和ToList的位置的,这是因为如果你先ToList,然后Take 100,整个底层的原始列表将被处理,然后100将被取。我们可以通过先取100,然后将底层集合转换为list来提高效率,这样可能会节省数千次对Distinct的调用。这要归功于IEnumerable和LINQ提供的deferred execution
https://stackoverflow.com/questions/62754542
复制相似问题