2014-10-13 62 views
0

我首先使用EF代碼。兩張桌子。包含用於在多個表中進行比較的方法

公司表(字段:CompanyName)和標籤表(TagName)。公司表中有一個鏈接到變量表

public class Company 
    { 
    public int Id { get; set; } 
    public string CompanyName { get; set; } 
    public virtual ICollection<Tags> Tags { get; set; } 
    } 

我想檢索所有的公司,其中公司名稱包含一個被傳遞的字符串,並檢索具有該字符串作爲一個標籤

 var result = from c in _db.Company 
        select new CompaniesVM 
        { 
         Id = c.Id, 
         CompanyName = c.CompanyName 
        }; 

     if (!String.IsNullOrEmpty(searchString)) 
     { 
      result = result.Where(s => s.CompanyName.Contains(searchString)); 
     } 

所有的公司我數據庫包含:

公司名稱:test1的

公司名稱:公司測試

如果我用searchString「test」運行代碼,它只捕獲第一條記錄。包含方法不會捕獲第二條記錄。這是爲什麼?如何使用「測試」字符串捕獲所有記錄?

另外,如果我有變量名「測試」

公司名稱:ABC公司標籤:標籤名:測試

如何考慮標籤表,以及並獲得公司?

我使用下面

enter image description here

多到許多示例模式我可以做到這一切在一個查詢?也許使用延遲加載方法?

大加讚賞,如果你可以點我到一個類似的例子或示例代碼

+1

是第二家公司「測試」或「測試」 ? – artm

+0

都是小寫「測試」 – Ben

+0

@artm你是對的我重新檢查它沒有小寫。哎呀。你知道如何檢查標籤表中的記錄嗎? – Ben

回答

2

包含是區分大小寫的,所以如果你的數據是大寫的,你的搜索關鍵詞是較低的情況下,他們不會匹配。如果您想在搜索時忽略大小寫,請使用result.Where(s => s.CompanyName.ToLower().Contains(searchString.ToLower()))。要搜索標籤表格以及公司表加入他們

from c in _db.Company 
join t in _db.Tag on c.field equals t.field 
select new { Companyname = c.CompanyName, TagName = t.TagName} 
where !String.IsNullOrEmpty(search) && (c.CompanyName.Contains(search) || t.TagName.COntains(search) 

更新了很多很多,因爲你對公司的集合:

from c in _db.Company 
select new { 
    CompanyName = c.CompanyName 
} 
where !string.IsNullOrEmpty(search) 
     && (c.CompanyName.Contains(search) || c.Tags.Any(t => t.TagName.Contains(search)) 
+0

我已更新我的問題,請參閱它,我不認爲我不得不提到它是多對多的,所以我不能直接加入。我是否需要創建2個單獨的查詢?或者不知何故,我可以一起做所有事情?使用延遲加載?感謝您的幫助 – Ben

+0

謝謝Artm的作品!你可以給我解釋一下c.Tags.Any(t => t.TagName.Contains(搜索)的工作原理嗎?爲什麼包含Any()爲什麼它不會適用於Contains()方法? – Ben

+0

看看任何定義,任何將檢查包含c條件的所有標籤,如果任何標籤包含搜索關鍵字,則返回true。http://msdn.microsoft.com/en-us/library/vstudio/bb534972%28v=vs.100%29 。aspx – artm

相關問題