Method 'Boolean Contains..' has no supported translation to SQL

后端 未结 5 1216
盖世英雄少女心
盖世英雄少女心 2020-12-21 21:09

i have this in my query:

var results = (from urls in _context.Urls
               join documents in _context.Documents on urls.UrlId equals documents.Documen         


        
5条回答
  •  执笔经年
    2020-12-21 21:39

    You can't just write your own methods and call them from your query expression - the query translator has no idea what that method's meant to do.

    You could force the where clause to be executed in .NET after fetching the documents and words, potentially... although obviously that means fetching all the joined data from the database. Would that be okay?

    To do that, you'd want something like:

    var tmpQuery = (from urls in _context.Urls
                    join documents in _context.Documents 
                    on urls.UrlId equals documents.DocumentId
                    let words = (from words in _context.Words
                                 join hits in _context.Hits 
                                 on words.WordId equals hits.WordId
                                 where hits.DocumentId == documents.DocumentId
                                 select words.Text)
                    select new { urls, documents, words };
    
    var query = from r in tmpQuery.AsEnumerable()
                let urls = r.urls.ToList()
                let words = r.words.ToList()
                let documents = r.documents.ToList()
                where urls.ResolvedPath.Contains(breakedQuery, 
                                                 KeywordParts.Url, part) ||
                   documents.Title.Contains(breakedQuery,
                                            KeywordParts.Title, part) ||
                   documents.Keywords.Contains(breakedQuery,
                                               KeywordParts.Keywords, part) || 
                   documents.Description.Contains(breakedQuery, 
                                                  KeywordParts.Description, part) ||
                   words.Contains(breakedQuery, KeywordParts.Content, part)
                select new { urls, words, documents };
    

提交回复
热议问题