LINQ到实体不能识别方法url.该方法不能转换为存储表达式

本文关键字:不能 方法 转换 存储 表达式 url 识别 LINQ 实体 | 更新日期: 2023-09-27 18:17:10

这个问题是针对接受一个格式化的url值并与未格式化的数据库值进行比较的。

我有一个url/companies/my-company/

公司名称存储在数据库字段中为"My company"-注意:没有连字符,空格和大写字母。

它可以以更复杂的格式存储,如"John's Company>>",因为用户可以在CMS中输入它。

那么我如何比较我的公司和我的公司在LINQ到实体?

var type = Context.Set<Domain.Content.Organisation>()
                        .AsNoTracking()
                        .Select(x => new DataContracts.Content.Organisation
                        {
                            Id = x.Id
                            ,Name = x.Name
                            ,OrganisationTypeId = x.OrganisationTypeId
                            ,OrganisationTypeName = (x.OrganisationType != null) ? x.OrganisationType.Name : string.Empty
                            ,Categories = x.Categories.Select(i => i.Id)
                            ,IsCustomer = x.IsCustomer
                            ,CountryId = x.CountryId
                            ,CountryName = (x.Country != null) ? x.Country.Name : string.Empty,
                            SeoName = x.SeoName,
                            Description = x.Description,                           
                            Website = x.Website
                        })
                        .FirstOrDefault(x => x.Id == id || Urls.MeaningfulURL(x.SeoName.ToLower(), null) == seoName.ToLower());

问题是:

Urls.MeaningfulURL(x.SeoName.ToLower(), null) == seoName.ToLower()

生成错误:

LINQ to Entities does not recognize the method Urls.MeaningfulURL method, and this method cannot be translated into a store expression.

我明白它的意思,但想不出一个解决办法。

url。有意义的url是一个方法,做了大量的字符串替换来创建url格式'my-company'。

我如何在查询时正确格式化列x.SeoName,使其匹配我的url输入?

谢谢

LINQ到实体不能识别方法url.该方法不能转换为存储表达式

EF无法将Urls.MeaningfulURL转换为SQL。有这么多的选项来解决它:

1。先加载数据:

var type = Context.Set<Domain.Content.Organisation>()
    .AsNoTracking()
    .Select(your select)
    .ToList()
    .FirstOrDefault(x => x.Id == id || Urls.MeaningfulURL(x.SeoName.ToLower(), null) == seoName.ToLower());

这是最简单的,但它会产生性能问题,因为所有的Organisation将从db加载到内存中。

2。重写你的逻辑。

你不能将自定义方法应用于x.SeoName,所以不要这样做。尝试将查询重写为:

var type = Context.Set<Domain.Content.Organisation>()
    .AsNoTracking()
    .Select(your select)
    .FirstOrDefault(x => x.Id == id || computedString.Contains(x.SeoName));

是的,你可以使用Contains,至少对于SQL Server提供程序。

3。将逻辑移到SQL:

如果使用SQL Server,你可以在SQL Server上尝试计算列,视图,甚至CLR代码等

4。将计算值存储在db:

有时最好存储Urls.MeaningfulURL(x.SeoName.ToLower(), null)值,或者与x.SeoName一起存储,并在查询中使用该存储值。还可以在此字段上添加索引