.NET Linq 语句的问题

Issues with .NET Linq statement

Linq 和 Query 的语法是我最薄弱的技能之一。我在获得预期结果方面遇到问题。

我有两个表/集合。一个充满了文档类型,另一个充满了通知。这些是他们认为重要的领域,我省略了那些不重要的领域。

文档类型

通知

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

我需要 supplierID 来获取与该供应商相关的所有 DocumentType 的列表。然后我需要 userID 和 ProductID 来获取与它们相关的通知列表。

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

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

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

到目前为止我有什么。

之前的版本只需要添加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,然后将其与我制作的新集合结合起来,或者是否有更好的方法来解决这个问题?

没有具体的代码示例,所以首先我会定义一些变量。 假设我们有名称为 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();

左连接呢

 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
    }