Linq和Query的语法是我最弱的技能之一。我在获得理想结果方面遇到了问题。
我有两个表/集合。一个填充DocumentTypes,另一个填充Notifications。这些是他们认为重要的领域,我省略了那些不合适的领域。
DocumentTypes
通知
我有三个参数; userID,supplierID和productID。
我需要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,然后将其加入我制作的新集合中,或者有更好的方法来解决这个问题?
答案 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
}