gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 04:38:10 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