8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

EF Core LINQ 无法转换架构子方法

Sean Voorhies 1月前

41 0

我们有一个 BaseSchema 类,它包含另一个模式的 IEnumerable,该模式包含我们的应用程序使用的每种语言的数据。我们在基本模式中编写了一个辅助方法,它将获取...

我们有一个 BaseSchema 类,其中包含 IEnumerable 另一个模式,该模式包含我们的应用程序使用的每种语言的数据。

我们在基础模式中编写了一个辅助方法,该方法将获取所提供语言的描述模式中的属性,如果未找到任何属性,则获取第一个具有值的属性。

return await Context.Allergies
    .Include(allergy => allergy.Descriptions)
    .AsNoTracking()
    .Select(allergy => new SynchronizableAllergyViewModel
    {
        Id = allergy.Id.ToString(),
        IsCommon = allergy.IsCommon,
        Name = allergy.GetTranslatedString(d => d.Name, Language),
    })
    .ToListAsync();
public string GetTranslatedString(Func<TMultilingualSchema, string> stringParam, 
    TLanguageSchemaId languageId)
{
    return Descriptions
        .OrderBy(d => d.LanguageId.Equals(languageId) ? 0 : 1)
        .Select(stringParam)
        .FirstOrDefault(d => !string.IsNullOrWhiteSpace(d)) ?? string.Empty;
}

我们在 SQL Server 上使用 .NET 6.0 和 EF Core 6.0.16。

使用辅助方法时,我们得到

LINQ 表达式“d => d.Name”无法翻译

但是,我们可以就地复制方法体并获得预期的结果

return await Context.Allergies
    .Include(allergy => allergy.Descriptions)
    .AsNoTracking()
    .Select(allergy => new SynchronizableAllergyViewModel
    {
        Id = allergy.Id.ToString(),
        IsCommon = allergy.IsCommon,
        Name = allergy.Descriptions.OrderBy(d => d.LanguageId.Equals(Language) ? 0 : 1)
            .Select(d => d.Name)
            .FirstOrDefault(d => !string.IsNullOrWhiteSpace(d)) ?? string.Empty
    })
    .ToListAsync();

我们尝试改变方法以使用表达式并从参数名称构建表达式,但没有成功。

当我们在带有 EF Core 7.0.5 的 .NET 7 上尝试“复制”解决方案时,它给出与方法调用相同的结果。

帖子版权声明 1、本帖标题:EF Core LINQ 无法转换架构子方法
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由Sean Voorhies在本站《linq》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 来实现 LINQKit

    先决条件:

    1. 安装包 LinqKit.Microsoft.EntityFrameworkCore 。 根据 EF Core 主版本选择适当的版本。
    2. 通过选项 LINQKit 激活
    builder
        .UseSqlServer(connectionString)
        .WithExpressionExpanding(); // enabling LINQKit extension
    

    按下列方式修改您的方法:

    public class Allergy
    {
        ... // other properties
    
        [Expandable(nameof(GetTranslatedStringImpl))]
        public string GetTranslatedString(Func<TMultilingualSchema, string> stringParam, 
            TLanguageSchemaId languageId)
        {
            throw new NotImplementedException();
        }
    
        private static Expression<Func<Allergy, Func<TMultilingualSchema, string>, TLanguageSchemaId, string>> GetTranslatedStringImpl()
        {
            return (allergy, stringParam, languageId) => allergy.Descriptions
                    .OrderBy(d => d.LanguageId.Equals(languageId) ? 0 : 1)
                    .Select(stringParam)
                    .FirstOrDefault(d => !string.IsNullOrWhiteSpace(d)) ?? string.Empty    
        }
    }
    

    之后,您可以在 LINQ 查询中使用您的方法。

返回
作者最近主题: