3

何が欠けているのかわかりませんが、午後中ずっとこれにぶつかっています。

次のような会社のSQLServerビューがあります。

CompanyId varchar(30) NOT NULL
CompanyName varchar(100) NOT NULL
CompanyPriority int NULL
ConfigItem int NOT NULL

次のようなデータを使用します。

00001 | Company One | 99 | 123
00001 | Company One | 99 | 456
00001 | Company One | 99 | 789
00002 | Company Two | 99 | 123
00002 | Company Two | 99 | 456

私は会社の明確なリストを取得しようとしています。私が実行したいSQLクエリは

select distinct CompanyId, CompanyName,CompanyPriority from vwCompany

これは私が望む結果を正確に与えてくれます

00001 | Company One | 99
00002 | Company Two | 99

しかし、私の人生では、このSQLを生成するLINQクエリ、または同じ結果を生成するものを見つけることができません。

私が見つけたすべての質問は、単体テストでは正常に機能しますが、実際のデータベースに対して実行すると明確な結果を返さないグループ化を使用しています。

編集:

それで、私はこれまでの答えに基づいていくつかのことを試みました。

Dim data = _miRepository.GetCompanies().
  Select(Function(c) New With {
           .companyId = c.CompanyId,
           .companyName = c.CompanyName,
           .companyPriority = c.CompanyPriority
         }
       ).Distinct().ToList()

SQLを生成します

SELECT 
1 AS [C1], 
[Extent1].[CompanyId] AS [CompanyId], 
[Extent1].[CompanyName] AS [CompanyName], 
[Extent1].[CompanyPriority] AS [CompanyPriority]
FROM (SELECT 
      [vwCompany].[CompanyId] AS [CompanyId], 
      [vwCompany].[CompanyName] AS [CompanyName], 
      [vwCompany].[CompanyPriority] AS [CompanyPriority], 
      [vwCompany].[CiId] AS [CiId]
      FROM [dbo].[vwCompany] AS [vwCompany]) AS [Extent1]

明確な演算子はまったく含まれていません:(

そして、はい、私は良い例を見つけるのを難しくするためだけにVB.NETでこれを行っています:\

編集2:

私はVBでできる限りEricJsの答えに近づこうとしています。

Dim data = (From c In _miRepository.GetCompanies()
            Select New With {.companyId = c.CompanyId,
                             .companyName = c.CompanyName,
                             .companyPriority = c.CompanyPriority
                            }
                          ).Distinct().ToList()

私にくれます

SELECT 
1 AS [C1], 
[Extent1].[CompanyId] AS [CompanyId], 
[Extent1].[CompanyName] AS [CompanyName], 
[Extent1].[CompanyPriority] AS [CompanyPriority]
FROM (SELECT 
      [vwCompany].[CompanyId] AS [CompanyId], 
      [vwCompany].[CompanyName] AS [CompanyName], 
      [vwCompany].[CompanyPriority] AS [CompanyPriority], 
      [vwCompany].[CiId] AS [CiId]
      FROM [dbo].[vwCompany] AS [vwCompany]) AS [Extent1]

まだ明確なキーワードが見つかりません:(

たぶん、私が見逃しているVB.NETの微妙な違いがあります。

編集3:

このアプリケーションの残りの部分を進めるために、私は今のところあきらめて、質問の最初にsqlステートメントを使用して新しいビュー(vwDistinctCompanies)を作成しました。

誰かがSQLビューに対してVB.NETでこれを機能させることができたら、私に知らせてください。なぜこれがLINQでそれほど難しいのか、私にはわかりません:(

4

5 に答える 5

2

クエリの最後に .Distinct() を使用してみてください。

(from r in ctx.MyTable where SomeCondition select r).Distinct();

http://msdn.microsoft.com/en-us/library/system.linq.enumerable.distinct.aspx

必要に応じて、IEqualityComparer を提供することもできます。ただし、IEqualityComparer を使用するには、結果の列挙型を最初に を使用して具体化する必要があります。ToEnumerable() . これを行うと、DB サーバーではなくクライアントで Distinct() 操作が実行されます。

http://msdn.microsoft.com/en-us/library/bb338049.aspx

IEqualityComparer を使用すると、どのレコードが同等として扱われるため、他のレコードと区別されないかを正確に制御できます。

テーブルの列のサブセットのみを選択する場合は、

select r

次のような匿名タイプのいずれかを選択します。

(from r in ctx.MyTable where SomeCondition
    select new 
    { 
        CompanyId = r.CompanyId, 
        CompanyName = r.CompanyName, 
        CompanyPriority = r.CompanyPriority
    }
).Distinct();

または、厳密に型指定されたオブジェクトが必要な場合 (たとえば、MVC で厳密に型指定されたビューを使用している場合:

public class CompanyModel
{
    public int CompanyId { get; set; }
    public string CompanyName { get; set; }
    public int CompanyPriority { get; set; }
}

// Then in the Linq statement

(from r in ctx.MyTable where SomeCondition
    select new CompanyModel()
    {
        CompanyId = r.CompanyId, 
        CompanyName = r.CompanyName, 
        CompanyPriority = r.CompanyPriority
    }
).Distinct();
于 2012-11-27T15:07:22.440 に答える
1

-編集:-

以前に言及したすべてのコードを無視します (最後の編集セクションの後のすべて)。さらにテストしてみました。次の VB コードをプラグインして、得られた結果を教えてください。

(From c In ctx.Companies Select New With { _
    Key .companyId = c.CompanyId, _
    Key .companyName = c.CompanyName, _
    Key .companyPriority = c.CompanyPriority _
}).Distinct()

LINQPad を使用してテストしたところ、次の SQL が得られました。

SELECT DISTINCT [t0].[CompanyId] AS [companyId],
                [t0].[CompanyName] AS [companyName],
                [t0].[CompanyPriority] AS [companyPriority]
FROM [Companies] AS [t0]

-編集終了-

私は数日前にこの問題を抱えていました。これが私がやったことです。

あなたが探しているのGroupByは、投稿で述べたように句が必要です。使用Distinctするだけでは、期待どおりに機能しません (私の知る限り)。次のラムダ式は私が行ったもので、その直後はラムダ コードによって生成された SQL ステートメントです。

ラムダ コード:

Companies.GroupBy(c => new {
                           c.CompanyId,
                           c.CompanyName,
                           c.CompanyPriority
                       })
         .Select(p => new {
                          CompanyId = p.Key.CompanyId,
                          CompanyName = p.Key.CompanyName,
                          CompanyPriority = p.Key.CompanyPriority
                      })

SQL コード:

SELECT [t0].[CompanyId] AS [companyId],
       [t0].[CompanyName] AS [companyName],
       [t0].[CompanyPriority] AS [companyPriority]
FROM [Companies] AS [t0]
GROUP BY [t0].[CompanyId],
         [t0].[CompanyName],
         [t0].[CompanyPriority]
于 2012-11-27T15:37:52.877 に答える
0

試す:

var results = (from company in context.Companies
    select new {
        CompanyId = company.CompanyId,
        CompanyName = company.CompanyName,
        CompanyPriority = company.CompanyPriority
    }).Distinct();

重要なのは、一緒に一意にすることができるクエリの断片を取得してから、.Distinct()拡張機能を呼び出すことです。そこに configID プロパティを残すと、それらはすべて一意になります。

于 2012-11-27T15:09:17.057 に答える
0
var query = from c in context.vwCompany
            group c by new { 
                c.CompanyId, 
                c.CompanyName, 
                c.CompanyPriority } into g
            select g.Key;

Generated query (from SQL Server Profiler) will look like:

SELECT 
1 AS [C1], 
[Distinct1].[CompanyId] AS [CompanyId], 
[Distinct1].[CompanyName] AS [CompanyName]
[Distinct1].[CompanyPriority] AS [CompanyPriority]
FROM ( SELECT DISTINCT 
    [Extent1].[CompanyId] AS [CompanyId], 
    [Extent1].[CompanyName] AS [CompanyName]
    [Extent1].[CompanyPriority] AS [CompanyPriority]
    FROM [dbo].[vwCompany] AS [Extent1]
) AS [Distinct1]
于 2012-11-27T15:09:35.553 に答える