簡體   English   中英

使用LINQ拆分字符串

[英]Split string with LINQ

我想通過我的結果在我的字符串行中匹配計數。

所以這是代碼

.ThenByDescending(p => p.Title.ToLower()
                              .Split(' ')
                              .Count(w => words.Any(w.Contains)));

但它給我帶來了錯誤,並說LINQ無法將Split解析為SQL。

LINQ to Entities無法識別方法'System.String [] Split(Char [])'方法,並且此方法無法轉換為商店表達式。

如何通過LINQ實現Split?

例如,對於此數組,它必須以這種方式排序

words = { "a", "ab" }

ab a ggaaag gh //3 matches
ba ab ggt //2 matches
dd //0 matches

這意味着Linq對實體未能找到可以寫成sql查詢的split方法的翻譯。 如果要執行拆分功能,則必須通過調用ToList()AsEnumerable()等將記錄帶入內存。

var result = (from t in db.Table
              select t).AsEnumerable().OrderBy(x=>x.Column).ThenByDescending(p=>p.Title.ToLower.Split(' ')....);

您需要在LINQ to Objects中執行排序,因為LINQ to Entities無法將C#代碼轉換為SQL(或您正在使用的任何DB的語言)。

你可以這樣做。

var results = 
  objectContext
  .Where(a => a == b) //Whatever
  .AsEnumerable()
  .ThenByDescending(p=>p.Title.ToLower().Split(' ').Count(w=>words.Any(w.Contains)));

AsEnumerable() (與ToArray()ToList() )將LINQ to Entities轉回LINQ to Objects。

人們不能指望LINQ to Entities能夠將其轉換為SQL。

最佳解決方案是更改架構,使帖子標題中的每個單詞作為單獨的行存儲在單獨的表中(具有適當的關聯)。 然后,查詢可以使用顯式(組)連接操作或FK關聯屬性。

如果您不能這樣做並且希望查詢在數據庫上運行,那么您將不得不考慮編寫用戶定義的函數來處理分隔的字符串。 閱讀此問題以獲取更多信息。 這將是很多工作。

最簡單的解決方案(如果你能負擔得起的話)當然是把所有東西都拉回到客戶端,只需使用LINQ to Objects查詢那部分內容,如@Muhammad Adeel Zahid所述。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM