0

Linq 和 Query 的语法是我最薄弱的技能之一。我在获得所需结果时遇到问题。

我有两个表/集合。一个是 DocumentTypes,另一个是 Notifications。这些是他们认为重要的领域,我省略了那些无关紧要的领域。

文档类型

  • ID
  • 姓名
  • 供应商 ID

通知

  • ID
  • 文档类型ID
  • 用户身份
  • 产品编号
  • Last_Sequence

我有三个参数;用户 ID、供应商 ID 和产品 ID。

我需要供应商 ID 来获取与该供应商相关的所有 DocumentTypes 的列表。然后我需要 userID 和 ProductID 来获取与这些相关的通知列表。

然后我需要加入这两个列表,每个通知都会有一个与之链接的 documentTypeID。当有特定文档类型的通知时,它需要包含字段 Last_Sequence 并创建一个设置为 true 的新 bool 字段。

当没有通知时,可以将 Last_sequence 留空,并创建 bool 并将其设置为 false。

所以结果将是一个包含具有这些类型的对象的列表。

  • 文档类型ID
  • 文档类型名称
  • BoolField(确实有一个与此相关的通知)
  • 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

没有具体的代码示例,所以首先我将定义一些变量。假设我们有带有名称的文档类型documentTypes列表和带有名称的通知列表notifications。如果我正确理解您的问题,那么以下 linq 查询将满足您的需求

documentTypes.Where(d => d.SupplierID == SuppId)
    .GroupJoin(notifications, 
                d => d.ID, 
                n => n.DocumentTypeID, 
                (document, notification) => new {document, notification}
    )
    .Select(join =>
    {
        var anyNotification = join.notification.FirstOrDefault();
        return new
        {
            DocTypeID = join.document.ID,
            DocTypeName = join.document.Name,
            Subscribed = join.notification.Any(),
            NotificationID = anyNotification != null ? anyNotification.ID : null,
            Last_sequence = anyNotification != null ? anyNotification.Last_Sequence: null,
        };
    }).ToList();
于 2017-04-27T10:14:51.683 回答
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 回答