簡體   English   中英

實體框架和linq字符串比較問題

[英]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.

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