我有从数据库派生的以下EF类(简化)
class Product
{
public string ProductId;
public string ProductName;
public string CategoryId;
public string CategoryName;
}
Run Code Online (Sandbox Code Playgroud)
ProductId
是表的主键.
对于DB设计者做出的糟糕的设计决策(我无法修改它),我有CategoryId
和CategoryName
在这个表中.
我需要一个DropDownList的使用(不同)CategoryId
的价值,并CategoryName
为文本.因此我应用了以下代码:
product.Select(m => new {m.CategoryId, m.CategoryName}).Distinct();
Run Code Online (Sandbox Code Playgroud)
从逻辑上讲,它应该使用CategoryId
和CategoryName
作为属性创建一个匿名对象.在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) 这就是我想要做的.假设我有这张桌子:
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) 我有一个包含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)
我需要没有任何重复的国名.其实我需要他们id
和title
,什么是最好的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) 这就是我想要做的.我正在使用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) 考虑
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)
但是给了我"不是一个表达的群体"
我有一个一对多关系的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有所不同.
我想在列表中获取不同的值,但不是通过标准的相等比较.
我想做的是这样的:
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)
但这似乎就像写一些应该存在的东西一样.
任何人都知道为什么这种方法不存在?
我错过了什么吗?
我需要做一个大问题,但我只想要最新的记录.
对于单个条目,我可能会做类似的事情
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:
SELECT count(distinct accessid) FROM (`accesslog`) WHERE record = '123'
Run Code Online (Sandbox Code Playgroud)
我怎么能在CodeIgniter里面做这种查询?
我知道我可以使用$this->db->query()
,并编写自己的SQL查询,但我有其他要求,我想用它$this->db->where()
.如果我使用->query()
虽然我必须自己编写整个查询.
我有这个型号:
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) distinct ×10
sql ×4
c# ×3
group-by ×2
linq ×2
codeigniter ×1
django ×1
duplicates ×1
field ×1
hibernate ×1
hql ×1
ienumerable ×1
java ×1
linq-to-xml ×1
max ×1
min ×1
mysql ×1
one-to-many ×1
php ×1
postgresql ×1
select ×1
subquery ×1