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输入?
谢谢
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
一起存储,并在查询中使用该存储值。还可以在此字段上添加索引