C# Linq to Sql支持我的字符串查询,但不在属性中。我能来吗?
我有一门课,里面有一个题目。我有一个属性,返回稍微调整过的标题。如果对调整后的title属性执行Linq到Sql查询,则会出现“不受支持”异常。如果我直接在linq查询中执行相同的操作,则该属性将正常工作。关于如何使该属性在LINQtoSQL中工作,有什么想法吗 这是物业C# Linq to Sql支持我的字符串查询,但不在属性中。我能来吗?,c#,linq-to-sql,C#,Linq To Sql,我有一门课,里面有一个题目。我有一个属性,返回稍微调整过的标题。如果对调整后的title属性执行Linq到Sql查询,则会出现“不受支持”异常。如果我直接在linq查询中执行相同的操作,则该属性将正常工作。关于如何使该属性在LINQtoSQL中工作,有什么想法吗 这是物业 public string SeoName { get { return Name.ToLower().Replace(" ", "").Replace("&", "and"); } } 这是一个不起作用的查
public string SeoName
{
get { return Name.ToLower().Replace(" ", "").Replace("&", "and"); }
}
这是一个不起作用的查询(我希望能够做到)
这里有一个查询,它做同样的事情并且工作正常
var series = from s in videoRepo.GetShows()
where s.Topic.Name.ToLower().Replace(" ", "")
.Replace("&", "and").Equals(topicSeoName)
select s;
如何构造top属性以使用第一个linq查询
我的最后答案
添加了一个表达式,用于计算我要查找的内容
public static Expression<Func<Show, bool>>
TopicSeoNameEquals(string name)
{
return t => t.Topic.Name.ToLower().
Replace(" ", "").Replace("&", "").Equals(name);
}
基本上你不能。LINQtoSQL无法“查看”SeoName属性并将其转换为SQL。但是,当您在LINQ to SQL查询中内联编写看似相同的代码时,编译器以LINQ to SQL可以“查看内部”的方式构建它。它创建一个表达式树(查询中操作序列的抽象描述),而不是将代码编译成MSIL
您可以通过创建一个与SeoName执行相同任务的表达式来解决这个问题,但最终还是要复制SeoName代码,以便让C#将一个副本编译为可调用的MSIL方法,另一个编译为表达式树。(虽然您可以通过在运行时编译表达式树让SeoName属性工作来解决这个问题:这可以避免重复,但会牺牲一些性能,而且看起来有点奇怪。)看看-它有一些让一个表达式调用另一个表达式的东西,等等。我使用PredicateBuilder非常棒。我利用你的想法得出了上面的最终答案。我根据链接中的项目创建了我的答案。不过,我最终并没有用LinqKit来做这件事。谢谢你的链接,因为它提供了一些很好的信息。
public static Expression<Func<Show, bool>>
TopicSeoNameEquals(string name)
{
return t => t.Topic.Name.ToLower().
Replace(" ", "").Replace("&", "").Equals(name);
}
var test = Show.TopicSeoNameEquals(topicSeoName);
var series = from s in videoRepo.GetShows().Where(test)
select s;