标签: distinct

如何在多个字段中使用LINQ Distinct()

我有从数据库派生的以下EF类(简化)

class Product
{ 
     public string ProductId;
     public string ProductName;
     public string CategoryId;
     public string CategoryName;
}
Run Code Online (Sandbox Code Playgroud)

ProductId是表的主键.

对于DB设计者做出的糟糕的设计决策(我无法修改它),我有CategoryIdCategoryName在这个表中.

我需要一个DropDownList的使用(不同)CategoryId价值,并CategoryName文本.因此我应用了以下代码:

product.Select(m => new {m.CategoryId, m.CategoryName}).Distinct();
Run Code Online (Sandbox Code Playgroud)

从逻辑上讲,它应该使用CategoryIdCategoryName作为属性创建一个匿名对象.在Distinct()保证有没有重复对(CategoryId,CategoryName).

但实际上它不起作用.据我所知,Distinct()当集合中只有一个字段时,它就会忽略它们......这是正确的吗?有没有解决方法?谢谢!

UPDATE

对不起product是:

List<Product> product = new List<Product>();
Run Code Online (Sandbox Code Playgroud)

我找到了另一种获得相同结果的方法Distinct():

product.GroupBy(d => new {d.CategoryId, d.CategoryName}) 
       .Select(m => new {m.Key.CategoryId, m.Key.CategoryName})
Run Code Online (Sandbox Code Playgroud)

c# linq distinct

62
推荐指数
5
解决办法
16万
查看次数

SQL:在选择不同的行时按一个字段中的最小值进行分组

这就是我想要做的.假设我有这张桌子:

id | record_date | other_cols
18 | 2011-04-03  | x
18 | 2012-05-19  | y
18 | 2012-08-09  | z
19 | 2009-06-01  | a
19 | 2011-04-03  | b
19 | 2011-10-25  | c
19 | 2012-08-09  | d
Run Code Online (Sandbox Code Playgroud)

对于每个id,我想选择包含最小record_date的行.所以我得到:

id | record_date | other_cols
18 | 2011-04-03  | x
19 | 2009-06-01  | a
Run Code Online (Sandbox Code Playgroud)

我在这个问题上看到的唯一解决方案是假设所有record_date条目都是不同的,但在我的数据中并非如此.使用带有两个条件的子查询和内部联接会给我一些id的重复行,这是我不想要的:

id | record_date | other_cols
18 | 2011-04-03  | x
19 | 2011-04-03  | b
19 | 2009-06-01  | a
Run Code Online (Sandbox Code Playgroud)

sql group-by max distinct min

59
推荐指数
3
解决办法
14万
查看次数

如何在SQL中的一个字段中选择无重复的记录?

我有一个包含3列的表,如下所示:

+------------+---------------+-------+  
| Country_id | country_title | State |  
+------------+---------------+-------+    
Run Code Online (Sandbox Code Playgroud)

此表中有许多记录.他们中的一些state人和其他人没有.现在,想象一下这些记录:

1 | Canada  | Alberta  
2 |  Canada | British  Columbia  
3 | Canada  | Manitoba  
4 | China   |
Run Code Online (Sandbox Code Playgroud)

我需要没有任何重复的国名.其实我需要他们idtitle,什么是最好的SQL命令,使这个?我DISTINCT在下面的表格中使用但是我无法获得适当的结果.

SELECT DISTINCT title,id FROM tbl_countries ORDER BY title
Run Code Online (Sandbox Code Playgroud)

我想要的结果是这样的:

1, Canada  
4, China
Run Code Online (Sandbox Code Playgroud)

sql select distinct duplicates

53
推荐指数
3
解决办法
35万
查看次数

C#与IEnumerable <T>的区别在于自定义IEqualityComparer

这就是我想要做的.我正在使用LINQ to XML查询XML文件,它为我提供了一个IEnumerable <T>对象,其中T是我的"Village"类,填充了此查询的结果.有些结果是重复的,所以我想在IEnumerable对象上执行Distinct(),如下所示:

public IEnumerable<Village> GetAllAlliances()
{
    try
    {
        IEnumerable<Village> alliances =
             from alliance in xmlDoc.Elements("Village")
             where alliance.Element("AllianceName").Value != String.Empty
             orderby alliance.Element("AllianceName").Value
             select new Village
             {
                 AllianceName = alliance.Element("AllianceName").Value
             };

        // TODO: make it work...
        return alliances.Distinct(new AllianceComparer());
    }
    catch (Exception ex)
    {
        throw new Exception("GetAllAlliances", ex);
    }
}
Run Code Online (Sandbox Code Playgroud)

由于默认的比较器不适用于Village对象,我实现了一个自定义的比较器,如AllianceComparer类中所示:

public class AllianceComparer : IEqualityComparer<Village>
{
    #region IEqualityComparer<Village> Members
    bool IEqualityComparer<Village>.Equals(Village x, Village y)
    {
        // Check whether the compared objects reference the same data.
        if (Object.ReferenceEquals(x, y)) …
Run Code Online (Sandbox Code Playgroud)

c# ienumerable distinct linq-to-xml

52
推荐指数
3
解决办法
4万
查看次数

不同的值对SQL

考虑

 create table pairs ( number a, number b ) 
Run Code Online (Sandbox Code Playgroud)

数据在哪里

1,1
1,1
1,1
2,4
2,4
3,2
3,2
5,1
Run Code Online (Sandbox Code Playgroud)

等等.

什么查询给了我b列数b的不同值所以我可以看到

1,1
5,1
2,4
3,2
Run Code Online (Sandbox Code Playgroud)

只要

我试过了

select distinct ( a ) , b from pairs group by b 
Run Code Online (Sandbox Code Playgroud)

但是给了我"不是一个表达的群体"

sql group-by distinct

52
推荐指数
4
解决办法
8万
查看次数

一对多关系在不使用"distinct"的情况下获取重复对象.为什么?

我有一个一对多关系的2个类和一个有点奇怪的HQL查询.即使我已经阅读了一些已经发布的问题,但我似乎并不清楚.

Class Department{
   @OneToMany(fetch=FetchType.EAGER, mappedBy="department")
   Set<Employee> employees;
}
Class Employee{
   @ManyToOne
   @JoinColumn(name="id_department")
   Department department;
}
Run Code Online (Sandbox Code Playgroud)

当我使用以下查询时,我得到重复的Department对象:

session.createQuery("select dep from Department as dep left join dep.employees");

因此,我必须使用不同的:

session.createQuery("select distinct dep from Department as dep left join dep.employees");

这种行为是预期的吗?我认为这与SQL有所不同.

java hibernate hql distinct one-to-many

50
推荐指数
1
解决办法
4万
查看次数

为什么没有Linq方法通过谓词返回不同的值?

我想在列表中获取不同的值,但不是通过标准的相等比较.

我想做的是这样的:

return myList.Distinct( (x, y) => x.Url == y.Url );
Run Code Online (Sandbox Code Playgroud)

我不能,Linq中没有扩展方法可以做到这一点 - 只需要一个IEqualityComparer.

我可以用这个来解决它:

return myList.GroupBy( x => x.Url ).Select( g => g.First() );
Run Code Online (Sandbox Code Playgroud)

但这似乎很混乱.它也没有做同样的事情 - 我只能在这里使用它因为我有一把钥匙.

我也可以添加自己的:

public static IEnumerable<T> Distinct<T>( 
    this IEnumerable<T> input, Func<T,T,bool> compare )
{
    //write my own here
}
Run Code Online (Sandbox Code Playgroud)

但这似乎就像写一些应该存在的东西一样.

任何人都知道为什么这种方法不存在?

我错过了什么吗?

c# linq distinct

49
推荐指数
2
解决办法
1万
查看次数

使用Postgresql进行高效的最新记录查询

我需要做一个大问题,但我只想要最新的记录.

对于单个条目,我可能会做类似的事情

SELECT * FROM table WHERE id = ? ORDER BY date DESC LIMIT 1;
Run Code Online (Sandbox Code Playgroud)

但是我需要为大(数千个条目)数量的记录提取最新记录,但只记录最新条目.

这就是我所拥有的.效率不高.我想知道是否有更好的方法.

SELECT * FROM table a WHERE ID IN $LIST AND date = (SELECT max(date) FROM table b WHERE b.id = a.id);
Run Code Online (Sandbox Code Playgroud)

sql postgresql subquery distinct

49
推荐指数
3
解决办法
6万
查看次数

CodeIgniter:如何执行选择(不同的字段名称)MySQL查询

我正在尝试检索字段中所有唯一值的计数.

示例SQL:

SELECT count(distinct accessid) FROM (`accesslog`) WHERE record = '123'
Run Code Online (Sandbox Code Playgroud)

我怎么能在CodeIgniter里面做这种查询?

我知道我可以使用$this->db->query(),并编写自己的SQL查询,但我有其他要求,我想用它$this->db->where().如果我使用->query()虽然我必须自己编写整个查询.

php mysql codeigniter distinct

48
推荐指数
5
解决办法
13万
查看次数

按字段获取Queryset的不同值

我有这个型号:

class Visit(models.Model):
    timestamp  = models.DateTimeField(editable=False)
    ip_address = models.IPAddressField(editable=False)
Run Code Online (Sandbox Code Playgroud)

如果用户在一天内多次访问,如何根据ip字段筛选唯一行?(我想今天的独特访问)

today = datetime.datetime.today()
yesterday = datetime.datetime.today() - datetime.timedelta(days=1)

visits = Visit.objects.filter(timestamp__range=(yesterday, today)) #.something?
Run Code Online (Sandbox Code Playgroud)

编辑:

我看到我可以使用:

Visit.objects.filter(timestamp__range=(yesterday, today)).values('ip_address')
Run Code Online (Sandbox Code Playgroud)

获取只有ip字段的ValuesQuerySet.现在我的QuerySet看起来像这样:

[{'ip_address': u'127.0.0.1'}, {'ip_address': u'127.0.0.1'}, {'ip_address':
 u'127.0.0.1'}, {'ip_address': u'127.0.0.1'}, {'ip_address': u'127.0.0.1'}]
Run Code Online (Sandbox Code Playgroud)

如何在不评估QuerySet和获取数据库命中的情况下过滤此唯一性?

# Hope it's something like this...
values.distinct().count()
Run Code Online (Sandbox Code Playgroud)

django field distinct django-queryset

48
推荐指数
3
解决办法
6万
查看次数