在try 执行linq查询时,我遇到以下错误:

LINQ to实体无法识别方法的布尔值

我读过很多以前的问题,人们都会遇到同样的错误,如果我理解正确,那是因为LINQ to Entities需要将整个LINQ查询表达式转换为服务器查询,因此不能在其中调用外部方法.我还没能把我的情景转换成有效的东西,我的大脑开始崩溃,所以我希望有人能给我指出正确的方向.我们正在使用实体框架和规范模式(我对两者都不熟悉).

以下是使用该规范的代码:

ISpecification<Charity> specification = new CharitySearchSpecification(charityTitle, charityReference);

charities = charitiesRepository.Find(specification).OrderBy(p => p.RegisteredName).ToList();

下面是Linq表达式:

public System.Linq.Expressions.Expression<Func<Charity, bool>> IsSatisfied()
{
    return p => p.IsCharityMatching(this.charityName, this.charityReference);
}

下面是IsCharityMatching方法:

public bool IsCharityMatching(string name, string referenceNumber)
{
    bool exists = true;

    if (!String.IsNullOrEmpty(name))
    {
        if (!this.registeredName.ToLower().Contains(name.ToLower()) &&
            !this.alias.ToLower().Contains(name.ToLower()) &&
           !this.charityId.ToLower().Contains(name.ToLower()))
        {
            exists = false;
        }
    }

    if (!String.IsNullOrEmpty(referenceNumber))
    {
        if (!this.charityReference.ToLower().Contains(referenceNumber.ToLower()))
        {
            exists = false;
        }
    }

    return exists;
}

如果你需要更多信息,请告诉我.

非常感谢,

安妮莉

推荐答案

正如您已经了解到的,实体框架实际上不能将您的C#代码作为其查询的一部分来运行.它必须能够将查询转换为实际的SQL语句.为了使其正常工作,您必须将查询表达式重新构造为Entity Framework可以处理的表达式.

public System.Linq.Expressions.Expression<Func<Charity, bool>> IsSatisfied()
{
    string name = this.charityName;
    string referenceNumber = this.referenceNumber;
    return p => 
        (string.IsNullOrEmpty(name) || 
            p.registeredName.ToLower().Contains(name.ToLower()) ||
            p.alias.ToLower().Contains(name.ToLower()) ||
            p.charityId.ToLower().Contains(name.ToLower())) &&
        (string.IsNullOrEmpty(referenceNumber) ||
            p.charityReference.ToLower().Contains(referenceNumber.ToLower()));
}

.net相关问答推荐

使用EFCore.BulkExtensions库方法BulkInertOrUpdate时区分插入和更新的记录

.NET MAUI ListView - ObservableCollection - 在异步方法期间不更新

正则表达式在空格上拆分,除非在引号中

如何使用 C# 关键字作为属性名称?

C#6.0 字符串插值本地化

使用泛型装箱和拆箱

如何在 C# 中将 HTML 转换为文本?

DateTime.Now.ToString("yyyy-MM-dd hh:mm:ss") 返回上午时间而不是下午时间?

如何授予所有用户对我的应用程序创建的文件的完全权限?

如何在我的 C# 程序的面板中运行另一个应用程序?

所有数组在 C# 中都实现了哪些接口?

如何异步 Files.ReadAllLines 并等待结果?

如何在 Action 中传递参数?

为什么 double.NaN 不等于自身?

如何从文件中删除单个属性(例如只读)?

是否可以判断对象是否已附加到实体框架中的数据上下文?

将控制台输出镜像到文件

Windows 服务在哪个目录中运行?

如何卸载Microsoft .NET Core 1.0.0 RC2 - VS 2015 Tooling Preview 1?

从 bcp 客户端接收到 colid 6 的无效列长度