linq sql错误:文本数据类型无法选择为不同,因为它不具有可比性

时间:2009-08-20 05:18:17

标签: linq

我想从问题表中选择尚未包含在特定测验中的所有问题。 我的问题是为什么以下代码失败并显示消息:

无法将文本数据类型选为DISTINCT,因为它无法比较。 数据类型文本和文本在is运算符中不兼容。

var allQuestions = from q in my.Questions
                        select new
                        {
                            Select = new Boolean(),
                            Id = q.QuestionId,
                            QuestionName = q.Name,
                            QuestionText = q.Text,
                            Topic = q.Topic.Title
                        };

        var currentQuestions = from cq in my.QuizQuestions
                            where cq.Quiz.quizId == quizId
                            select new
                            {
                                Select = new Boolean(),
                                Id = cq.Questions.QuestionId,
                                QuestionName = cq.Questions.Name,
                                QuestionText = cq.Questions.Text,
                                Topic = cq.Questions.Topic.Title
                            };
var selectQuestions = allQuestions.Except(currentQuestions);

这在哪里工作正常:

 var allQuestions = (from q in my.Questions
                        select new
                        {
                            Select = new Boolean(),
                            Id = q.QuestionId,
                            QuestionName = q.Name,
                            QuestionText = q.Text,
                            Topic = q.Topic.Title
                        }).ToList();

        var currentQuestions = (from cq in my.QuizQuestions
                            where cq.Quiz.quizId == quizId
                            select new
                            {
                                Select = new Boolean(),
                                Id = cq.Questions.QuestionId,
                                QuestionName = cq.Questions.Name,
                                QuestionText = cq.Questions.Text,
                                Topic = cq.Questions.Topic.Title
                            }).ToList();


        int allquestionsCount = allQuestions.Count();
        for (int i = allquestionsCount; i < 0; i--)
        {
            foreach(var question in currentQuestions){
                if (question.Id.Equals(allQuestions.ElementAt(i - 1).Id))
                {
                    allQuestions.RemoveAt(i - 1);
                }
            }
        }

1 个答案:

答案 0 :(得分:4)

这实际上是一个SQL问题而不是LINQ问题,除了Except LINQ调用显然最终在SQL中被翻译为DISTINCT子句这一事实。

您可以让LINQ to Objects为您执行“except”部分:

var allQuestions = // code as before in first example
var currentQuestions = // code as before in first example
var selectQuestions = allQuestions.AsEnumerable()
                                  .Except(currentQuestions);

AsEnumerable的调用只会强制它使用LINQ to Objects进行后续操作,而不是将其全部转换为SQL查询。

显然效率很低,但它比你现在可能的O(n ^ 3)循环更好:)

虽然search for the error message(第一部分)在SQL端提供了一些可能有用的结果。我建议您记录生成的SQL,然后检查它并读取这些命中 - 它们可能会建议更改模式的方法,以允许在数据库中完成所有操作。