0

我正在使用具有自定义服务器端功能的 Linq2db:

[Sql.Function(Name = "UniqueValue", ServerSideOnly = true)]
public static int? UniqueValue( Expression<Func<ModelClass, string>> arg) {
            throw new NotSupportedException();
}

然后我尝试在带有分组的 linq 查询中使用它:

var query = from a in context.data
                    group a by a.field1 into newgroup
                    select new {final = UniqueValue(row => row.field2) };

然后我得到“row => row.field2' 不能转换为 SQL。” 运行时出错。

我使用 SqlLite 作为数据库,这是自定义函数:

[SQLiteFunction(Name = "UniqueValue", Arguments = 1, FuncType = FunctionType.Aggregate)]
    public class UniqueValue : SQLiteFunction {
        public override void Step(object[] args, int stepNumber, ref object contextData) {

        }

        public override object Final(object contextData) {
            return null;
        }
    }

有谁知道如何使自定义服务器端功能与分组一起使用?

4

1 回答 1

0

在 1.9.0 版中添加了对 linq2db 中自定义聚合函数的支持。您需要将函数定义为自定义聚合,如下所示:

[Sql.Function("UniqueValue", ServerSideOnly = true, IsAggregate = true, ArgIndices = new[]{0})]
public static TResult UniqueValue<TSource, TResult>(this IEnumerable<TSource> src, Expression<Func<TSource, TResult>> value)
    => throw new NotSupportedException();

并使用:

var query = from a in context.data
    group a by new a.field1 into newgroup
    select new { final = newgroup.UniqueValue(row => row.field2) };
于 2018-11-18T16:40:19.470 回答