Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/289.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Linq to Sql支持我的字符串查询,但不在属性中。我能来吗?_C#_Linq To Sql - Fatal编程技术网

C# Linq to Sql支持我的字符串查询,但不在属性中。我能来吗?

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"); } } 这是一个不起作用的查

我有一门课,里面有一个题目。我有一个属性,返回稍微调整过的标题。如果对调整后的title属性执行Linq到Sql查询,则会出现“不受支持”异常。如果我直接在linq查询中执行相同的操作,则该属性将正常工作。关于如何使该属性在LINQtoSQL中工作,有什么想法吗

这是物业

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;