我在将过滤条件应用于LINQ to SQL表时遇到错误。 有没有办法在LINQ to SQL中使用Where条件创建SQL查询?
错误: “方法”布尔值等于(System.String,System.String,System.StringComparison)'没有支持的SQL转换。“
以下是代码
public IQueryable<DocumentReplacementPack> GetDocumentReplacementPack(string state,int typeID)
{
if (this.DataContext.DocumentReplacementPacks.Count() > 0)
**return this.DataContext.DocumentReplacementPacks.Where(d => string.Equals(d.State, state, StringComparison.InvariantCultureIgnoreCase));**
else
return this.DataContext.DocumentReplacementPacks;
}
答案 0 :(得分:1)
不,这不是错误,遗憾的是,这比你想象的要多得多。让我们看看linq如何从高级别将表达式转换为sql
this.DataContext.DocumentReplacementPacks.Where(d => string.Equals(d.State, state, StringComparison.InvariantCultureIgnoreCase));
这将生成一个类似于
的sql调用select * from [DocumentReplacementPacks] where ??
现在将要发生的是表达式将进入string.Equals
调用,因为在sql中没有REAL等效的string.Equals
,linq不知道如何生成sql字符串。由于string.Equals
是一个c#函数而不是一个sql函数。一个非常好的例子就像是
public bool AreEqual(string one, string two){
return one.ToCharArray()[0] == two.ToCharArray()[0];
}
现在这是一个非常简单的例子,但想想你是否有这样的linq表达式:
return this.DataContext.DocumentReplacementPacks.Where(d => AreEqual(d.State, state));
您希望如何翻译?没有办法,linq将如何知道函数的确切行为。
解决这个问题的方法是切换到==
,因为linq知道如何翻译它。
return this.DataContext.DocumentReplacementPacks.Where(d =>d.State == state);
让数据库执行InvariantCultureIgnoreCase
,现在如果这不是一个选项,你只需要将数据读入内存并进行调用。
this.DataContext.DocumentReplacementPacks.ToList().Where(d => string.Equals(d.State, state, StringComparison.InvariantCultureIgnoreCase));
但我不建议,因为将整个数据集读入内存可能非常昂贵。
* OFF TOPIC *
此外,我正在查看您的代码,我强烈建议您更改this.DataContext.DocumentReplacementPacks.Count() > 0)
至
this.DataContext.DocumentReplacementPacks.Any())
Explanation。我常常对人们在没有真正了解IEnumerable / IQuerable的情况下如何使用linq感到失望,但您如何成为更好的开发人员呢?
答案 1 :(得分:0)
MS SQL默认情况下处理字符串不区分大小写,所以你应该使用'==',它可以由LINQ2SQL翻译