【发布时间】:2014-08-04 05:09:01
【问题描述】:
我总结了自己在 LINQ to EF 查询中摸索自定义方法的倒霉蛋。我浏览了网络,试图检测一种模式,使自定义方法对 LINQ 友好,虽然每个消息来源都说该方法必须是 translatable into a T-SQL query,但应用程序似乎非常多样化。所以,我将在这里发布我的代码,希望慷慨的 SO 居民能告诉我我做错了什么以及为什么。
代码
public IEnumerable<WordIndexModel> GetWordIndex(int transid)
{
return (from trindex in context.transIndexes
let trueWord = IsWord(trindex)
join trans in context.Transcripts on trindex.transLineUID equals trans.UID
group new { trindex, trans } by new { TrueWord = trueWord, trindex.transID } into grouped
orderby grouped.Key.word
where grouped.Key.transID == transid
select new WordIndexModel
{
Word = TrueWord,
Instances = grouped.Select(test => test.trans).Distinct()
});
}
public string IsWord(transIndex trindex)
{
Match m = Regex.Match(trindex.word, @"^[a-z]+(\w*[-]*)*",
RegexOptions.IgnoreCase);
return m.Value;
}
通过上面的代码,我访问了一个表transIndex,它本质上是一个从各种用户文档中挑选出来的单词索引。问题是并非所有条目实际上都是单词。 Nubers,甚至下划线,例如___________,,也会被保存。
问题
我只想保留我的自定义方法IsWord 返回的单词(目前我还没有真正开发出解析机制)。但正如IsWord 函数所示,它将返回string。
所以,我使用let 将我的自定义方法引入到查询中并将其用作分组参数,可以在我的对象中选择。执行后,我得到了无所不知的:
LINQ to Entities does not recognize the method
'System.String IsWord(transIndex)' method, and this
method cannot be translated into a store expression."
我还需要确保只返回符合IsWord 条件的记录。
有什么想法吗?
【问题讨论】:
-
你可以先枚举(这通常是个坏主意),或者在 IsWord 中解释你想做什么。有了这个,有人可能会帮助你(或解释为什么这是不可能的),而无需......
-
@RaphaëlAlthaus 查看编辑后的
IsWord方法
标签: c# sql linq entity-framework let