2

给定实体:

[Table("Clients")]
public class Client
{
    [Column("txtClientId")]
    public string ClientId { get; set; }

    [Column("OrganizationName")]
    public string ClientName { get; set; }
}

和 LINQ 查询:

var clients = (from c in database.Clients
                where c.ClientId.Contains(term) || c.ClientName.Contains(term)                
                select c).Distinct();

'clients' 的 VS 调试显示以下查询:

SELECT 
    [Extent1].[txtClientId] AS [txtClientId], 
    [Extent1].[OrganizationName] AS [OrganizationName]
FROM [dbo].[Clients] AS [Extent1]
WHERE ([Extent1].[txtClientId] LIKE @p__linq__0 ESCAPE N'~') OR 
    ([Extent1].[OrganizationName] LIKE @p__linq__1 ESCAPE N'~') 

请注意,没有“不同”。我对此进行了搜索,发现了一些解决方法,例如分组、匿名类型或在代码中执行不同的操作(即 ToList().Distinct()),但理想情况下,我想要 SQL:

SELECT DISTINCT
    [Extent1].[txtClientId] AS [txtClientId], 
    [Extent1].[OrganizationName] AS [OrganizationName]
FROM [dbo].[Clients] AS [Extent1]
WHERE ([Extent1].[txtClientId] LIKE @p__linq__0 ESCAPE N'~') OR 
    ([Extent1].[OrganizationName] LIKE @p__linq__1 ESCAPE N'~') 

我已经尝试使用标记为“[Key]”的“ClientId”,但行为没有变化。

为什么这没有生成我期望的查询,我该如何让它这样做?由于我有解决方法,我更感兴趣的是了解我在这里缺少什么以及获得所需 SQL 的最佳方法。

4

2 回答 2

5

您正在调用Queryable.Distinct,这绝对可以翻译为 Sql。

也许 LinqToEntities 将您在类上使用 Distinct 理解Client为“引用不同”。数据库中的每一行都是一个引用不同的实例,即使没有主键也是如此。

尝试将您想要的列投影到匿名类型(应该使用值相等而不是引用相等):

select new {c.ClientId, c.ClientName}
于 2012-09-06T19:27:50.680 回答
0

我相信这与在链接查询中使用“.Contains()”有关。
也许您应该尝试使用 LINQ 链接而不是查询语法。
IE

database
    .Clients
    .Where (client => client.ClientId.Contains(term) || client.ClientName.Contains(term))
    .Distinct();
于 2012-09-06T20:44:36.137 回答