【发布时间】:2018-03-08 15:02:01
【问题描述】:
我有代码,它工作正常。
using (var dbContext = new UnitOfWorkFactory(sqlConnection).Create())
{
var result = dbContext.Repository<SomeTable>()
.Get()
.AsNoTracking()
.Where(r => r.Id == 1)
.Select(item => new
{
TableId = item.TableId,
OriginalTableName = item.TableName.Replace("$", "_")
})
.SingleOrDefault();
当我尝试在单独的私有方法中替换逻辑时,我得到了异常。我知道主要原因是 LINQ to SQL 提供程序无法将 clr 方法转换为 SQL。
...
.Select(item => new
{
TableId = item.TableId,
OriginalTableName = SubQueryReplace(item.TableName)
})
...
实际上我想我必须使用表达式树,但无法解决我必须如何编写它。当我尝试从 SubQueryReplace 方法返回 Expression<Func<string>> 时,CLR 编译器不满意,但是当我尝试执行类似
private Expression<Func<string, string>>SubQueryReplace(string fieldValue)
{
Expression<Func<string, string>> exp = (tableName) => tableName.Replace("D", "_");`
return exp
}
...
.Select(item => new
{
TableId = item.TableId,
OriginalTableName = SubQueryReplace.Compile.Invoke(item.TableName)
})
...
LINQ to Sql 不明白我想从中得到什么。
所以你可以看到我很困惑。请帮助解决这个语法任务。
【问题讨论】:
-
为什么要把这个逻辑放到单独的函数中?
-
因为有很多重复的功能。许多不同的方法使用相同的逻辑。我真的认为我必须以单独的方法移动它,或者实现规范模式并在规范中移动所有重复的逻辑
-
你能不能也提一下这个例外?
-
Somethink 像 linq to sql 不支持 SubQueryReplace 方法
-
@AllmanTool Replace 方法可以在 entityframework 6.2 版本中转换为 sql
标签: c# linq linq-to-sql expression-trees