尝试创建一个Linq查询,该查询可以在一个命令中执行多次搜索,而不是具有多个搜索结果页面。当我试图找到具有主题的多个记录(在我的情况下为CHIEF_COMPLAINT)和具有特定单词的注释时,它工作得很好。问题是我想用序列号搜索。
这里有两个问题。一个是可以将多件设备连接到特定票证,并且单件设备也可以与多张票证相关联。当我查询用于将设备与故障单关联的表(VIEW_WT_EQUIP,使用视图,因为它是看到序列号的位置)时,我可能会使用相同的Ticket_ID获得多个结果。
这是我现在的查询,但是当我输入我知道在系统中的序列号时,它不会返回任何结果。
var query = from a in db.VIEW_WT_HEADERs
join c in db.VIEW_WT_EQUIPs on a.TICKET_ID equals c.TICKET_NUMBER into c_group
from c2 in c_group
join b in db.WT_EVENTs on a.TICKET_ID equals b.TICKET_ID
where b.COMMENTS.Contains(input) || a.CHIEF_COMPLAINT.Contains(input) || c2.SERIAL_NUMBER.Contains(input)
orderby a.TICKET_ID descending
select new { a.TICKET_ID, a.ENTRY_DATE, a.CONTACT, a.CHIEF_COMPLAINT, a.STATUS };
我还尝试了一种方法,我使用2个linq查询并将序列号搜索中的所有票号放入列表中,但第二个查询不喜欢我试图比较一个int数组。
我想我只是错了。加入可能不是正确的方法,但我不知道如何告诉主查询拉出与设备相关的所有门票。
请让我知道我可以澄清的地方,因为我知道这种探索很粗糙。
答案 0 :(得分:2)
我会把它作为评论而不是答案,但我想给你看一些代码,所以我不得不选择“回答”。
如果您使用Linq to Entities,则可能在对象之间存在关系。这意味着join
不是必需的。只有在没有可用的导航属性时才应该使用join。
我无法准确说出你应该做什么,但这里有一些可能有用的代码:
var query = from a in db.VIEW_WT_HEADERs
from b in a.WT_EVENTs
from c in a.VIEW_WT_EQUIPs
where b.COMMENTS.Contains(input) || a.CHIEF_COMPLAINT.Contains(input) ...
orderby a.TICKET_ID descending
select new { a.TICKET_ID, a.ENTRY_DATE, a.CONTACT, a.CHIEF_COMPLAINT, a.STATUS };
您也可以使用let
来存储子表达式:
var query = from a in db.VIEW_WT_HEADERs
from b in a.WT_EVENTs
from c in a.VIEW_WT_EQUIPs
let x = c.FirstOrDefault()
where b.COMMENTS.Contains(input) || a.CHIEF_COMPLAINT.Contains(input) || x.SomeProperty ....
orderby a.TICKET_ID descending
select new { a.TICKET_ID, a.ENTRY_DATE, a.CONTACT, a.CHIEF_COMPLAINT, a.STATUS };
这些只是示例,也许有帮助!