在 LINQ 查询中确实允许使用扩展方法,而且LINQ 方法本身是作为扩展方法实现的。
然而,在 LINQ-to-SQL 或 LINQ-to-Entities 查询中使用扩展方法(或大多数其他方法)是另一个问题。这些查询实际上并未在 C# 代码中运行,但它们被视为转换为 SQL 的表达式。IE
db.News.Where(x => x.Published).Select(x => x.Name)
被翻译成 SQL 语句
Select Name
From News
Where Published = 1
并将其结果返回到 C# 代码。
由于无法将该ToFriendlyUrl()
方法传输到 SQL,因此您的代码会引发错误。
您基本上有两个解决方案/解决方法。一种是将调用转换为可以转换为 SQL 的表单,例如,如果ToFriendlyUrl()
方法只是:
public static string ToFriendlyURL(this string value)
{
return value.ToLower();
}
您可以在 LINQ 调用中内联该代码,这样就可以了。但是,如果这些方法更复杂,那么您唯一的解决方案就是从基础中获取数据,然后在 C# 端进行处理:
var newsTypeQuery = db.NewsTypes.Where(x => // other conditions, if any);
var newsTypes = newsTypes.ToList(); //forces execution of the query
// the result is now a C# list
var newsType = newsTypes.FirstOrDefault(x =>
x.Name.ToFriendlyUrl() == name.ToFriendlyUrl());