2009-11-14 44 views
2

我有一个课程,里面有一个标题。我有一个属性返回该标题调整了一下。如果我做LINQ SQL查询调整的标题属性我得到“不支持”的异常。如果我做同样的事情,该属性直接在linq查询中工作。关于如何让这个属性在Linq中工作到Sql的任何想法?Linq to Sql支持我的字符串查询,但不支持属性。我可以做到吗?

这里是财产

public string SeoName 
{ 
    get { return Name.ToLower().Replace(" ", "").Replace("&", "and"); } 
} 

这里是不工作(我想做什么就能做)查询。

var series = from s in videoRepo.GetShows() 
      where s.Topic.SeoName.Equals(topicSeoName) 
      select s; 

这里是做同样的事情和工作

var series = from s in videoRepo.GetShows() 
      where s.Topic.Name.ToLower().Replace(" ", "") 
      .Replace("&", "and").Equals(topicSeoName) 
      select s; 

我怎么能结构中的顶级物业的查询与第一LINQ查询工作?

我最后的答案

补充说,在LINQ查询评估什么,我一直在寻找

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; 

回答

2

基本上,你的表达不能。 LINQ to SQL无法“查看”SeoName属性并将其转换为SQL。但是,当您在LINQ to SQL查询中编写内联代码时,编译器会以LINQ to SQL可以“查看内部”的方式构建它。它创建一个表达式树 - 查询中操作序列的抽象描述 - 而不是将代码编译为MSIL。

您可以通过创建一个与SeoName完成相同工作的表达式来解决此问题,但您仍然最终将重复SeoName代码,以便让C#将一个副本编译为可调用MSIL方法,另一个作为表达式树。 (虽然你可以在这个上工作,通过让你的SeoName属性在运行时通过编译表达式树来工作:这会绕过重复而牺牲一些性能并且看起来有点奇怪。)

+0

我用你的想法拿出上面的最终答案。 – 2009-11-14 21:20:41

2

看看LinqKit - 它有一些东西让一个表达调用另一个,等等。我使用PredicateBuilder是一个很好的东西。

+0

我根据链接中的项目创建了我的答案排序。尽管如此,我并没有最终使用LinqKit。感谢您的链接,因为它提供了一些很好的信息。 – 2009-11-14 21:21:27