.NET Linq语句

时间:2017-04-27 09:35:40

标签: c# linq linq-query-syntax linq-method-syntax

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

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

DocumentTypes

  • ID
  • 名称
  • 供应商ID

通知

  • ID
  • DocumentTypeID
  • 用户ID
  • 的ProductID
  • Last_Sequence

我有三个参数; userID,supplierID和productID。

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

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

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

因此,结果将是包含具有这些类型的对象的列表。

  • DocumentTypeID
  • DocumentTypeName
  • 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,然后将其加入我制作的新集合中,或者有更好的方法来解决这个问题?

2 个答案:

答案 0 :(得分:1)

没有具体的代码示例,所以首先我将定义一些变量。 假设我们有名称为$rootScope.$on('$locationChangeStart', function() { document.body.scrollTop = document.documentElement.scrollTop = 0; });的文档类型列表和名称为documentTypes的通知列表。如果我正确理解您的问题,那么以下linq查询将执行您想要的操作

notifications

答案 1 :(得分: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
    }