我编写了自己的对象标签,我想包含是否找到.Value(我想在SQL中模拟WHERE IN)
public static List<Question> GetQuestionsIdsWithTags(List<Tag> tags)
{
IEnumerable<Question> res = from t in dataClasses.tags
join
qt in dataClasses.question_to_tags on t.id equals qt.tag_id
join q in dataClasses.questions on qt.question_id equals q.id
where tags.Contains<Tag>(new Tag(t.name))
select new Question(q.text) { };
问题是,如果包含在查询中,我会得到
The member 'Core.Literal.Value' has no supported translation to SQL.
Literal是Tag的基础。
我该怎么办?
答案 0 :(得分:3)
您正在尝试执行new Tag(t.name)
,但这无法转换为SQL(数据库服务器无法创建Tag类的新实例)。也许这会奏效:
IEnumerable<Question> res = from t in dataClasses.tags
join
qt in dataClasses.question_to_tags on t.id equals qt.tag_id
join q in dataClasses.questions on qt.question_id equals q.id
where tags.Select(x => x.name).Contains(t.name)
select new Question(q.text) { };
答案 1 :(得分:2)
如果tags
是List<string>
,您应该找到:
where tags.Contains(t.Name)
工作正常;但它能理解的内容是有限的(更重要的是,写成TSQL)。
答案 2 :(得分:1)
如果LinQ Contains()
语句由包含List
或int
等基本数据类型的string
执行,则只能将其翻译为SQL。如果您需要将tags
列表转换为字符串或整数列表,那么它应该可以正常工作。