gpt4 book ai didi

c# - 创建可在 LINQ (EF) 中使用的辅助方法

转载 作者:行者123 更新时间:2023-12-02 21:35:34 25 4
gpt4 key购买 nike

场景:

Foo列为varchar(8) NOT NULL时,我有一个表FooTable,并且该列中的信息如下:

Foo
-----------
13940-00
13940-01
13940-02
13941-00
13941-01

连字符 (-) 后面的数字部分始终有两位数字。

问题:

我正在使用 Ado.net Entity Framework ,并创建了一个具有 2 个静态方法的类来帮助获取数字的第一部分和第二部分:

public class HelperFoo
{
public static string Prefix(string value) { /* code here */ }
public static string Suffix(string value) { /* code here */ }
}

所以现在我可以做这样的事情:

context.FooTable.Where(w => HelperFoo.Prefix(w.Foo) == "13940");

但是,您可能已经知道,此命令行会抛出 NotSupportedException。这是因为 LINQ 无法识别 HelperFoo.Prefix,因此无法转换 SQL 中的表达式。

我可以用 SQL 编写一段代码,其作用与我的 HelperFoo 方法相同,这样我就可以根据我的方法创建 SQL。

问题

我可以创建一些东西(类、方法或其他),让 LINQ 在执行 LINQ 代码时知道我的方法吗?

已编辑

PS:我需要一些像方法或 SQL 函数一样通用的东西,因为我需要在 Select、OrderBy、GroupBy 等场景中获取此前缀和后缀。

最佳答案

您可以尝试创建自己的 IQueryable FooTable 的过滤器,有点像这样:

public static class Filters
{
public static IQueryable<FooTable> WithPrefix(this IQueryable<FooTable> item, string prefix)
{
return item.Where(i => i.Foo.StartsWith(prefix));
// note that this should be the same code you have in the
// Prefix() method inside HelperFoo...
}
}

你可以这样使用:

context.FooTable.WithPrefix("13940");

更新:遗憾的是,这里的第二个选项不起作用:

另一种选择是让辅助方法不返回值,而是返回 Predicate<>对于 FooTable :

public class HelperFoo
{
public static Func<FooTable, bool> Prefix(string value)
{
return (i) => i.Foo.Substring(0, 5) == value;
}
public static Func<FooTable, bool> Suffix(string value) { /* code here */ }
}

并像这样使用它:

context.FooTable.Where(HelperFoo.Prefix("13940"));

警告:我不完全确定第二种方法不会给您带来同样的问题。

关于c# - 创建可在 LINQ (EF) 中使用的辅助方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21462295/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com