.NET Linq 语句的问题
Issues with .NET Linq statement
Linq 和 Query 的语法是我最薄弱的技能之一。我在获得预期结果方面遇到问题。
我有两个表/集合。一个充满了文档类型,另一个充满了通知。这些是他们认为重要的领域,我省略了那些不重要的领域。
文档类型
- ID
- 姓名
- 供应商ID
通知
- ID
- 文档类型 ID
- 用户ID
- 产品编号
- Last_Sequence
我有三个参数;用户 ID、供应商 ID 和产品 ID。
我需要 supplierID 来获取与该供应商相关的所有 DocumentType 的列表。然后我需要 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,然后将其与我制作的新集合结合起来,或者是否有更好的方法来解决这个问题?
没有具体的代码示例,所以首先我会定义一些变量。
假设我们有名称为 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
}
Linq 和 Query 的语法是我最薄弱的技能之一。我在获得预期结果方面遇到问题。
我有两个表/集合。一个充满了文档类型,另一个充满了通知。这些是他们认为重要的领域,我省略了那些不重要的领域。
文档类型
- ID
- 姓名
- 供应商ID
通知
- ID
- 文档类型 ID
- 用户ID
- 产品编号
- Last_Sequence
我有三个参数;用户 ID、供应商 ID 和产品 ID。
我需要 supplierID 来获取与该供应商相关的所有 DocumentType 的列表。然后我需要 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,然后将其与我制作的新集合结合起来,或者是否有更好的方法来解决这个问题?
没有具体的代码示例,所以首先我会定义一些变量。
假设我们有名称为 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
}