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'のVSDebuggingは、次のクエリを示しています。

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'~') 

'Distinct'がないことに注意してください。私はこれを検索し、グループ化、匿名型、またはコードでの個別化(つまり、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

これは間違いなくSqlQueryable.Distinctに変換可能です。

おそらく、LinqToEntities は、クラスでの Distinct の使用をClient「参照的に異なる」と理解しています。データベースの各行は、主キーがない場合でも、参照的に異なるインスタンスです。

必要な列を匿名型に射影してみてください (参照の等価性ではなく値の等価性を使用する必要があります)。

select new {c.ClientId, c.ClientName}
于 2012-09-06T19:27:50.680 に答える