- xml - AJAX/Jquery XML 解析
- 具有多重继承的 XML 模式
- .net - 枚举序列化 Json 与 XML
- XML 简单类型、简单内容、复杂类型、复杂内容
我有一个复杂的 LINQ 查询(使用 LINQ 2 EF)可以返回重复的结果,因此我使用 .Distinct()
方法来避免重复。这是骨架:
var subQuery1 = // one query...
var subQuery2 = // another query...
var result = subQuery1.Distinct().Union( subQuery2.Distinct() ).ToArray();
每个子查询将一个公共(public)用户表与另一个表连接起来并执行“where”查询,结果随后在 .Union(...)
中合并。在表被修改为包含一个 XML 列之前,这一直工作得很好,这导致了这个异常:
the xml data type cannot be selected as distinct because it is not comparable
在这种情况下,我不关心 XML 列在结果中是否相同。实际上我只需要确保主键 UserId
在结果中是不同的。
有没有办法使用 Distinct()
但忽略 XML 列或更简单的方法来确保我从结果中删除具有相同 UserId
的记录有效的方法?理想情况下,这不会从数据库中检索重复记录,也不需要后处理来删除重复项。
更新:我发现,如果我提前将查询序列化为数组,那么就不需要任何类型的比较器,因为 Linq2Objects 没有 XML 不同选择问题。例如我可以这样做:
var subQuery1 = // one query...
var subQuery2 = // another query...
var result =
subQuery1.Distinct().ToArray().Union(
subQuery2.Distinct().ToArray() )
.ToArray();
所以我真正想要的是一种避免序列化中间查询并直接执行 Linq2Entities 调用的方法,该调用不会获取具有重复 UserId
的记录。感谢您到目前为止的所有回答。
最佳答案
写一个IEqualityComparer<T>
包含您的 XML 类型的对象的实现并将其传递给 Distinct
.在Equals
方法,您可以根据需要实现相等语义。
这是我自己编写的一个方便的 T4 代码生成模板,用于生成 IEqualityComparer<T>
我团队领域模型的实现:
<#@ template language="C#v3.5" debug="True" #>
<#@ output extension=".generated.cs" #>
<#
var modelNames = new string[] {
"ClassName1",
"ClassName2",
"ClassName3",
};
var namespaceName = "MyNamespace";
#>
using System;
using System.Collections.Generic;
namespace <#= namespaceName #>
{
<#
for (int i = 0; i < modelNames.Length; ++i)
{
string modelName = modelNames[i];
string eqcmpClassName = modelName + "ByIDEqualityComparer";
#>
#region <#= eqcmpClassName #>
/// <summary>
/// Use this EqualityComparer class to determine uniqueness among <#= modelName #> instances
/// by using only checking the ID property.
/// </summary>
[System.Diagnostics.DebuggerNonUserCode]
public sealed partial class <#= eqcmpClassName #> : IEqualityComparer<<#= modelName #>>
{
public bool Equals(<#= modelName #> x, <#= modelName #> y)
{
if ((x == null) && (y == null)) return true;
if ((x == null) || (y == null)) return false;
return x.ID.Equals(y.ID);
}
public int GetHashCode(<#= modelName #> obj)
{
if (obj == null) return 0;
return obj.ID.GetHashCode();
}
}
#endregion
<#
if (i < modelNames.Length - 1) WriteLine(String.Empty);
} // for (int i = 0; i < modelNames.Length; ++i)
#>
}
它假设您的每个模型类都有一个名为“ID”的属性,它是主键,存储为实现 Equals 的东西。我们的惯例强制我们所有的模型都具有此属性。如果您的模型都具有不同名称的 ID 属性,请考虑修改此 T4 模板以满足您的需求或更好,让您的生活更轻松(不仅仅是为了使用此 T4)并更改您的模型以使用“ID "名字。
关于c# - LINQ Select Distinct 忽略 XML 字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3929620/
我有一个包含电子邮件、IP、州、城市、时间戳、ID 列的表 我需要按州分组计算电子邮件和 IP 的不同位置 所以当我运行 MYSQL 查询时, select State, City ,count(di
我试过 select distinct ID from DB.TABLE; 它返回所有记录中的唯一 ID。 select distinct * from DB.TABLE; 它将通过比较所有列
我正在尝试在 Postgresql 中编写一个查询,该查询提取一组有序数据并按不同的字段对其进行过滤。我还需要从同一表行中提取其他几个字段,但需要将它们排除在不同的评估之外。示例: SELECT
我有一个使用以下语句创建的 Postgres 表。该表由另一个服务的数据转储填充。 CREATE TABLE data_table ( date date DEFAULT NULL,
我在一个名为 products 的表中有 4 列 id|p_name| p_img | 1 | Xs | xsmax.png | 2 | Xs | xr.png |
当它的状态仅为"is"时,我想从“num”中选择不同的值,而不是立即包括“否”? 表: +--------+-----+--------+ | id | num | status | +---
全部!今天我有一个棘手的问题要给你,我想使用 select DISTINCT 语句来选择一个需要不同的行,但也在同一个语句中(或者我尝试过的方式?)一个没有的行't/不能区分。我想要的结果是每个类名中
我有一个正在使用 Distinct() 的 linq 查询。如果我只是调用 Distinct() 而没有转换为列表,那么它不会返回不同的列表 - 它仍然包含重复项。 但是,如果我转换为 List 并然
说到性能,我应该使用 .ToList().Distinct() 还是 .Distinct().ToList() ? 两种扩展方法是否生成相同的 SQL 查询? 看起来第二种方法应该表现更好,但这是真的
如何在不支持 SQL Server 2008R2 的 SQL 实现中重写包含标准 IS DISTINCT FROM 和 IS NOT DISTINCT FROM 运算符的表达式? 最佳答案 IS DI
有一张 table (在 HIVE) 示例 - meanalytics.key2_master_ids 该表有 6 列(cmpgn_id、offr_id、exec_id、creatv_id、cmpl_
SELECT * FROM `amc_info` WHERE department =' ( SELECT DISTINCT department ) into outfile = 'Differe
如何在Elasticsearch中计算“不同的平均值”?我有一些这样的非规范化数据: { "record_id" : "100", "cost" : 42 } { "record_id" : "200
关注这个question我有... ID SKU PRODUCT ======================= 1 FOO-23 Orange 2 BAR
我有这个 mysql 查询: SELECT DISTINCT post.postId,hash,previewUrl,lastRetrieved FROM post INNER JOIN (tag a
http://sqlfiddle.com/#!2/37dd94/17 如果我执行 SELECT DISTINCT,我得到的结果与只执行 SELECT 的结果相同。 在查询结果中,您将看到两个包含 Di
我有一列包含空条目,例如此列中的可能值为 None, 1, 2, 3 当我使用 session.query(func.count(distinct(Entry.col))).scalar() 计算列中
这是否可能从表列中选择不同的行并计算单个查询中每个不同字段的重复行 $sql = "SELECT DISTINCT location and COUNT(DISTINCT location)
我在 MySQL 数据库中有一个包含 1100 万行的表。其中一列是个人身份证号码。人们在表中被多次列出,我想知道有多少个唯一的个人 ID 号码。然后创建一个包含这些唯一数字的表格。当我计算列中不同的
我刚刚注意到我的 Informix SQL 列(在同一个表中)的某些 上有些奇怪。当我执行此查询时 SELECT DISTINCT colName FROM myTable 例如,我得到 40 行。但
我是一名优秀的程序员,十分优秀!