3

私は同僚と協力しており、LinqToEntities(Entity Framework v4.0)を使用して次のSQLクエリを再現しようとしています。

SELECT t1.*
FROM [dbo].LocaleStringResource AS t1
  LEFT OUTER JOIN [dbo].LocaleStringResource AS t2
    ON (t1.ResourceName = t2.ResourceName AND t1.AccountId < t2.AccountId)
WHERE t2.ResourceName IS NULL;

基本的には、一致するResourceNameが複数ある場合にのみ最高のAccountIdを返すと言っています。これまでにこれを持っています...

localeStringResource = from e1 in localeStringResource
  join e2 in localeStringResource
  on new { e1.ResourceName, e1.AccountId } equals new { e2.ResourceName, e2.AccountId }
  where e2.ResourceName == null
  select e1;

しかし、LEFT OUTER JOIN内で(<)未満の同等物を達成する方法を理解できないようです。

ON (t1.ResourceName = t2.ResourceName AND t1.AccountId < t2.AccountId)

これが可能かどうか、または間違った木を吠えているかどうかを誰かに教えてもらえますか?同等のLinqToEntitiesクエリの作成が容易になることを期待して、最初のクエリをできるだけ単純にすることを試みました。

ノート:

AccountIdユニークではありません。テーブルにIdentity Id列がありLocalResourceStringます。ただし、との両方に一意の制約がAccountIdありますResourceName

4

2 に答える 2

4

<編集>あなたが本当にやりたいのは、AccountIdそれぞれに最大のレコードを選択することのようResourceNameです。AccountIdそれが一意であると仮定すると、次のようになります。

localeStringResource =
    from e1 in localeStringResource
    group e1 by e1.ResourceName into grp
    select grp.Max(e => e.AccountID);

</編集>

ここには左外部結合があるため、LINQには---構文が必要になりGroupJoinます。とは等しくなるように再構築されますが、条件の残りの部分を後で:の前に追加できます。SelectManyDefaultIfEmptyJoinGroupJoinDefaultIfEmpty

localeStringResource =
    from e1 in localeStringResource
    join e2inner in localeStringResource
        on e1.ResourceName equals e2inner.ResourceName
        into grp
    from e2 in grp
        .Where(e => e1.AccountId < e.AccountId)
        .DefaultIfEmpty()
    where e2.ResourceName == null
    select e1;

参考までに、メソッドの構文は次のとおりです。私は以前Tuple、データを渡していました。

localeStringResource = localeStringResource
    .GroupJoin(
        localeStringResource,
        e1 => e1.ResourceName,
        e2 => e2.ResourceName,
        Tuple.Create)
    .SelectMany(pair => pair.Item2
        .Where(e2 => pair.Item1.AccountID < e2.AccountID)
        .DefaultIfEmpty()
        .Select( e2 => Tuple.Create(pair.Item1, e2)))
    .Where(pair => pair.Item2.ResourceName == null)
    .Select(pair => pair.Item1);
于 2012-10-08T14:26:53.023 に答える
-1

where句に結合基準を入れてANSI-82構文を使用してみてください。

localeStringResource = from e1 in localeStringResource
                       from e2 in localeStringResource
                       where e1.ResourceName = e2.ResourceName &&
                            e1.AccountId < e2.AccountId
                       select e1;
于 2012-10-08T14:17:30.383 に答える