[英]Entity framework and linq string comparsion issue
我有問題linq
..
讓我們看看代碼
我有一篇文章課:
public calss Article
{
public string Tag{get; set; }
}
我保存文章分裂每個標簽,
逗號。
例如: first,second,third
當我想要一篇文章時,我想獲得有任何常見標簽的文章。
我使用此查詢但是:
var relatedArticles =
_db.Articles.Where(a => a.Tag
.Split('،')
.Any(t => article.Tag
.Split('،')
.Any(ac => ac == t)));
我得到這個例外:
LINQ to Entities無法識別方法'System.String [] Split(Char [])'方法
還有其他方法嗎?
更新:我不能將標簽保存在不同的表中,因為我必須讓用戶在他/她插入文章時盡可能多地創建標簽。 像50一樣,在將文章保存到db時檢查該標記是否存在將是開銷。
按如下方式設置您的課程:
public class Article
{
public List<string> Tag{get; set; }
}
我不是100%確定你的第二個語句是做什么的,但是你可以使用a.Tag.Contains()來檢查你的值。
我認為我的評論可能值得回答你的問題,所以我把它寫成一個:)
你應該考慮你的桌子/班級設計。
您需要對其進行標准化,因為它看起來像n:m引用。 將文章保留在一個表中,並引用映射表,在該表中引用arcticleId和tagId,而不是一個帶有主鍵tagId的表。 如果將來一個標簽發生變化,您不需要更新每篇文章,只需更新該特定標簽,每個文章都會更改。
這意味着Linq to實體未能找到可以寫成SQL查詢的split方法的翻譯。 如果要執行拆分功能,則必須通過調用ToList()
, AsEnumerable()
等將記錄帶入內存。
但更好的方法是在db中為標記創建單獨的表。
Linq查詢看起來像這樣(假設文章和標簽之間存在多對多關系):
var relatedArticles =
_db.Articles.Where(a => a.Tags.Any(t => t.Articles.Count() > 1));
// if Article has Tag which is assigned more then to one Article then it suits us
“a.Tag.Split(',')”是表達式樹中您的IQueryable所在的節點,而不是實際操作。 通過調用類似ToList的方式實現結果時,整個表達式樹在執行之前被轉換為SQL表達式 - 這是錯誤點,因為轉換器不知道如何將Split()方法轉換為sql語句。
作為替代方案,您可以將所有結果檢索到應用程序中,通過ToList()實現它們,然后使用它們作為IEnumerables執行您想要的操作。 此外,您可以編寫存儲過程並將搜索標記數組傳遞到那里。
此外,它可能會工作 - 嘗試將一個簡單的值數組(而不是方法)傳遞給查詢,因此產生的SQL看起來像
"WHERE ... IN ...".
在使用EF時,不能直接在Linq中調用string.Split()
等常規方法,因為它無法轉換為SQL。
您可以將AsEnumerable()
附加到Where()
子句以使Linq獲取數據,從而允許您稍后執行此類操作。 不幸的是,這不允許你在沒有獲取整個列表的情況下用列表做你想做的事情,我相信你寧願避免。
也許你可以做這樣的事情嗎?:
List<string> tagsForCurrentArticle = ... // fetch this first somehow
_db.Articles.Where(a =>
tagsForCurrentArticle.Any(tag =>
a.Tag.Contains(tag)))
請注意,只是要明確:這應該可行,但如果可能的話,更好的選擇是將標簽移出到單獨的表中,正如其他人所建議的那樣。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.