2010-09-22 20 views
3

我很确定这个问题已经被问了好几次,我做apolgize再次问它,但我做了一些研究,不幸的是我没有找到我的乐趣在互联网上...LINQ 2 SQL查询不起作用的函数调用

我有一个IQueryable的是这样的:

public string GetIdProfiloFromName(string name) 
     { 
      return name.Substring(name.IndexOf(NameFirstSeparator)+1,name.IndexOf(NameSecondSeparator)-name.IndexOf(NameFirstSeparator)-1); 
     } 

我知道:

triggers = triggers.Where(t => GetIdFromName(t.Name) == filter.Id.ToString()); 

GetIdFromName获取名称的一部分来检索该ID的功能不好,但这是迄今为止我能做到的最好的。我的问题是,使用这两个语句不允许使用Linq to sql。该应用程序将引发一个错误,而这是确定:

triggers = triggers.Where(t => t.Name.Substring(t.Name.IndexOf(NameFirstSeparator) + 1, t.Name.IndexOf(NameSecondSeparator) - t.Name.IndexOf(NameFirstSeparator) - 1) == filter.Id.ToString()); 

我怀疑是功能GetIdFromName应该给的东西不是一个字符串不同,但我真的不知道是什么,以及如何...

感谢您的启示,

约恩

[编辑] 更新到我的理解至今:

我canno做T我想要的,因为为了做到这一点,我需要做这样的事情:

static Expression<Func<Trigger,string, bool>> IsId = (a,b) => a.name.Substring(a.name.IndexOf(NameFirstSeparator) + 1, a.name.IndexOf(NameSecondSeparator) - a.name.IndexOf(NameFirstSeparator) - 1)==b; 

,但这不会进入

triggers = triggers.Where(func<Trigger,bool>); 

,我可以想办法做到这一点,但我必须从我的数据库中获取所有结果才能在内存中执行我的测试。

非常感谢,你让我真的很清楚!

回答

5

LINQ 2 SQL正在将您的查询转换为expression tree,然后将该表达式树转换为SQL。由于您的自定义函数没有SQL相关函数,因此它不知道如何翻译它并引发异常。

+1

感谢您的快速回答。我认为,但真正的事情是知道如何将这些代码外部化为“外部”功能。这里的子字符串的东西是相当丑陋和沉重,我希望封装它在一个不错的功能。这应该是可能的,因为linq to sql能够理解它的原始格式。 – Arthis 2010-09-22 15:00:20

+1

不幸的是,你不能做你想要的。表达式树只支持一个表达式,表示为一棵树。要以您想要的方式支持方法,它必须能够处理块。例如,'x => {return x; }'不能编译到表达式树中。 – 2010-09-22 15:03:10

+0

+1对于一个很好的分析。 – 2010-09-22 15:11:08