gpt4 book ai didi

c# - 有没有一种简单的方法可以在 LINQ to Entities 中编写自定义函数?

转载 作者:太空狗 更新时间:2023-10-29 17:55:21 25 4
gpt4 key购买 nike

我正在为我的 Entity Framework 应用程序编写一个简单的搜索查询。我需要检查一堆字段是否为空,如果不是,则对它们调用 ToLower() 并与搜索查询进行比较。 LINQ 查询看起来像这样:

public IQueryable<Store> SearchStores(string q, IQueryable<Store> source)
{
q = q.ToLower();

return (
from s in source
where (
(s.Name != null && s.Name.ToLower().Contains(q)) ||
(s.Description != null && s.Description.ToLower().Contains(q)) ||
...
}

有很多这样的行,所以我很想写一个辅助方法来稍微清理一下:

public static bool SafeSearch(this string s, string q)
{
return s == null ? false : s.ToLower().Contains(q);
}

但这当然行不通,因为 LINQ to entities 不理解 SafeSearch 函数是什么:

LINQ to Entities does not recognize the method 'Boolean SafeSearch(System.String, System.String)' method, and this method cannot be translated into a store expression.

有没有一种简单的方法可以编写这样一个简单的自定义函数?

谢谢!

最佳答案

由于 linq 使用的表达式在您实际调用数据库之前不会执行,因此您需要将函数包装在谓词中。

private static Func<Country, bool> Predicate(string q)
{
return x => (
q.SafeSearch(x.Name) ||
q.SafeSearch(x.Description)
);
}

同时通过在查询时调用它来反转 SafeSearch 扩展方法,将处理 x.Name 为 null 的情况。

public static class SearchExt
{
public static bool SafeSearch(this string q, string param)
{
return param == null ? false : param.ToLower().Contains(q);
}
}

然后你可以将它与扩展方法一起使用

return source.Where(Predicate(q));

或者使用linq表达式

return from p in source
where Predicate(q).Invoke(p)
select p;

关于c# - 有没有一种简单的方法可以在 LINQ to Entities 中编写自定义函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10484728/

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