【问题标题】:mixing c# functions with Linq-To-SQL conditions将 c# 函数与 Linq-To-SQL 条件混合
【发布时间】:2012-04-02 21:50:50
【问题描述】:

我在将 c# 函数与 Linq-To-SQL 中的条件混合时遇到问题

假设我有一个数据库表“things”和一个本地 c# 函数:bool isGood(thing, params)

我想使用该函数从表中选择行。

var bad = dataContext.Things.Where(t=>t.type=mytype && !isGood(t,myparams))
dataContect.Things.deleteAllOnSubmit(bad);

if (dataContext.Things.Any(t=>t.type=mytype && isGood(t,myparams)))
{
    return false;
}

当然这样不行,Linq 没有办法把我的函数翻译成 SQL 语句。所以这会产生:

NotSupportedException:方法 'Boolean isGood(thing,params)' 没有支持的 SQL 转换。

重新设计它以使其正常工作的最佳方法是什么?

我可以像这样拆分语句并转换为列表:

List<Things> mythings dataContext.Things.Where(t=>t.type=mytype).toList()
if (mythings.Any(t=>isGood(t,myparams)))
{
    return false;
}

这可行,但似乎效率低下,因为在每种情况下都必须生成整个列表。 而且我认为我不能对结果执行 deleteAllOnSubmit

我可以对神话做一个 foreach 而不是调用 toList(),这也有效。不过看起来很不雅。

我还有哪些其他选择,这里推荐的方法是什么?

编辑:

调用 asEnumerable() 似乎是另一种选择,至少似乎比 toList() 更好。即

dataContext.Things.Where(t=>t.type=mytype).asEnumerable().Any(t=>isGood(t,myparams))

【问题讨论】:

  • isGood() 函数是一个可以包含的简单函数吗?如果它可以表示为 Linq,那将是迄今为止最简单的解决方案。
  • 相当复杂。除其他外,它检查 item1 是否适合另一个表中的任何 item2,并允许旋转
  • 是的,我是这么想的。我认为那时没有任何选择。必须把整个名单拉回来。找到主键,然后在提交时将它们全部删除。我很想知道是否有其他人能想出解决方法,所以我会收藏它,看看是否有人能想出解决方法。

标签: c# linq linq-to-sql c#-4.0 notsupportedexception


【解决方案1】:

从数据库中拉回整个列表以在其上运行本地 c# 函数可能看起来效率低下,但如果您的 isGood() 函数是本地函数,则必须这样做。

如果您可以将 isGood() 函数转换为 Linq,则可以在 toList() 调用之前应用它,这样它就会被转换为 SQL,并且不会检索到整个列表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-08-21
    • 2012-11-02
    • 1970-01-01
    • 2021-08-12
    • 1970-01-01
    相关资源
    最近更新 更多