0

Linq と Query の構文は、私の最も苦手なスキルの 1 つです。望ましい結果を得るのに問題があります。

2 つのテーブル/コレクションがあります。1 つは DocumentTypes で満たされ、もう 1 つは Notifications で満たされます。これらは問題を保持するフィールドです。そうでないものは省略しました。

ドキュメントの種類

  • ID
  • 名前
  • サプライヤーID

通知

  • ID
  • DocumentTypeID
  • ユーザーID
  • 製品番号
  • Last_Sequence

3 つのパラメーターがあります。ユーザー ID、サプライヤー ID、および製品 ID。

そのサプライヤに関連付けられているすべての DocumentTypes のリストを取得するには、supplierID が必要です。次に、それらに関連付けられた通知のリストを取得するために、userID と ProductID が必要です。

次に、これら 2 つのリストに参加する必要があります。すべての通知には、リンク先の documentTypeID があります。特定のドキュメント タイプの通知がある場合、Last_Sequence フィールドを含め、true に設定された新しい bool フィールドを作成する必要があります。

通知がない場合は、Last_sequence を空のままにし、bool を作成して false に設定できます。

したがって、結果はこれらの型を持つオブジェクトのリストになります。

  • DocumentTypeID
  • DocumentTypeName
  • BoolField (これに関連付けられた通知がある場合は true)
  • NotificationID (存在する場合のみ)
  • Last_sequence (存在する場合のみ)

私がこれまでに持っているもの。

以前のバージョンでは、bool フィールドと documentType 情報を追加するだけで済みました。そのために私はこの声明を出しましたが、必要なものをそれに追加することはできないようです:

List<DocumentTypeNotification> docTypes = repository.Get<Domain.DocumentType>().Where(d => d.SuppID == SuppId).Select(d => new DocumentTypeNotification
            {
                DocTypeID = d.Id,
                DocTypeName = d.Name,
                Subscribed = notifications.Any(n => n == d.Id)
            }).ToList();

私が新しいもののために試したことはこれですが、通知が関連付けられている場合にのみデータが返されます。存在しない場合、その documentType データは返されません。

var temptest = from notif in repository.Get<Domain.Notification>()
                           join doctype in repository.Get<Domain.DocumentType>() on notif.DocTypeId equals doctype.Id
                           select new DocumentTypeNotification { DocTypeID = doctype.Id, DocTypeName = doctype.Name, Subscribed = true, NotifID = notif.Id, last_sequence =  notif.Last_Sequence};

編集:これは私が試したものの例ですが、うまくいきません。ここでの問題は、n.last_sequence を実行しようとすると n が存在しないことです。

List<DocumentTypeNotification> docTypes = repository.Get<Domain.DocumentType>().Where(d => d.SuppID == SuppId).Select(d => new DocumentTypeNotification
            {
                DocTypeID = d.Id,
                DocTypeName = d.Name,
                Subscribed = notifications.Any(n => n == d.Id),
                last_sequence = test.Where(n => n.DocTypeId == d.Id).Select(n.Last_Sequence).FirstOrDefault()
                //from n in test
                                //where n.DocTypeId == d.Id
                                //select n.Last_Sequence
            }).ToList();

これをどのように解決すればよいのか考えました。最初にすべての適切な DocumentTypes のコレクションを作成し、それを作成した新しいコレクションと結合する必要がありますか?それとも、これを解決するためのより良い方法はありますか?

4

2 に答える 2

1

左結合はどうですか

 from  d in repository.Get<Domain.DocumentType>()
    join n in repository.Get<Domain.Notification>()
       on d.Id equals n.DocTypeId
    into temp
    from notific in temp.DefaultIfEmpty()
    where  d.SuppID == SuppId
    select new
    {
        d.Name,
        last_sequence = notific != null ? notific.Last_Sequence : null,
        Subscribed  = notific != null
    }
于 2017-04-27T10:17:19.090 に答える