代码之家  ›  专栏  ›  技术社区  ›  Matthew Kruskamp

Linq to SQL支持我的字符串查询,但不在属性中。我能做吗?

  •  2
  • Matthew Kruskamp  · 技术社区  · 15 年前

    我有一门课,上面有标题。我有一个属性,它返回调整了一点的标题。如果我对调整后的标题属性执行LINQ to SQL查询,则会得到“不支持”异常。如果我在Linq查询中直接执行属性所做的相同操作,它就会正常工作。关于如何使属性在LinqToSQL中工作有什么想法吗?

    这是房产

    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;
    

    如何构造Top属性以使用第一个Linq查询?

    我的最终答案

    添加了一个表达式,该表达式计算了我要查找的内容

    public static Expression<Func<Show, bool>> 
            TopicSeoNameEquals(string name)
        {
            return t => t.Topic.Name.ToLower().
                Replace(" ", "").Replace("&", "").Equals(name);
        }
    

    然后,我只是在Linq查询中对它进行了不同的调用。

    var test = Show.TopicSeoNameEquals(topicSeoName);
    
    var series = from s in videoRepo.GetShows().Where(test)
                select s;
    
    2 回复  |  直到 15 年前
        1
  •  2
  •   itowlson    15 年前

    基本上你不能。linq to sql没有办法“查看”seoname属性并将其转换为sql。但是,当您在linq to sql查询中内联编写看起来相同的代码时,编译器以linq to sql可以“查找”的方式构建它。它创建了一个表达式树——对查询中操作序列的抽象描述——而不是将代码编译为msil。

    您可以通过创建一个表达式来解决这一问题,该表达式与seoiname执行相同的任务,但最终仍然会复制seoiname代码,以便让c将一个副本编译为可调用的msil方法,另一个则编译为表达式树。(尽管你可以四处工作 通过让seonname属性在运行时编译表达式树来工作:这样可以避免重复,但会牺牲一些性能,看起来有点奇怪。)

        2
  •  2
  •   nitzmahone    15 年前

    看一看 LinqKit -它有一些东西可以让一个表达式调用另一个表达式,等等。我用谓词生成器做了很多很好的东西。