【问题标题】:Linq to Sql supports my string query but not in a property. Can I make it?Linq to Sql 支持我的字符串查询,但不支持属性。我能做到吗?
【发布时间】:2009-11-15 05:20:00
【问题描述】:

我有一门课,里面有一个标题。我有一个属性可以返回该标题进行了一些调整。如果我对调整后的标题属性进行 Linq to Sql 查询,我会得到“不支持”异常。如果我做同样的事情,该属性直接在 linq 查询中起作用。关于如何使该属性在 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;

如何构造 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;

【问题讨论】:

    标签: c# linq-to-sql


    【解决方案1】:

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

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

    【讨论】:

    • 我根据你的想法得出了上面的最终答案。
    【解决方案2】:

    看看LinqKit- 它有一些东西可以让一个表达式调用另一个表达式,等等。我使用 PredicateBuilder 非常棒。

    【讨论】:

    • 我根据链接中的项目创建了我的答案。不过,我最终并没有使用 LinqKit 来做到这一点。感谢您提供的链接,因为它提供了一些很好的信息。
    猜你喜欢
    • 2022-11-17
    • 1970-01-01
    • 1970-01-01
    • 2011-07-06
    • 2013-11-17
    • 1970-01-01
    • 2010-09-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多