Linq to Entities在IQueryable中转换类型

时间:2017-12-05 23:00:28

标签: c# entity-framework-6 linq-to-entities

使用EnitityFramework 6,我们创建了一个方法,它接受输入类型(数据库实体)的IQueryable并返回输出类型的.Select。转换器类还有一种方法可将单个输入类型实例转换为单个输出类型实例。在internal static class FooConverter { internal static IQueryable<Bar> Convert(IQueryable<Foo> foos) { return foos.Select(d => Convert(d)); } internal static Bar Convert(Foo foo) { return new Bar { Id = foo.Id, Number = foo.Number, Valid = foo.Valid ?? false, }; } } lambda参数中使用Convert方法会导致运行时异常:

  

System.NotSupportedException:LINQ to Entities无法识别方法'Bar Convert(Foo)'方法,并且此方法无法转换为商店表达式。

Convert(Foo)

研究表明,Linq to Entities无法从我的internal static class FooConverter { internal static IQueryable<Bar> Convert(IQueryable<Foo> foos) { return foos .Select(d => new Bar { Id = foo.Id, Number = foo.Number, Valid = foo.Valid ?? false, )}; } internal static Bar Convert(Foo foo) { return new Bar { Id = foo.Id, Number = foo.Number, Valid = foo.Valid ?? false, }; } } 方法生成SQL,因此我进行了一些重构。如果我在两种方法中复制初始化,一切正常。

Convert(Foo)

但现在我有重复的代码。是否可以从Convert(IQueryable<Foo>)内拨打using System; using System.IO; namespace ConsoleApplication4 { class Program { static void Main(string[] args) { string[] lines = File.ReadAllLines(@"c:\Developer\TestFile.txt"); foreach (var line in lines) { Console.WriteLine(line); } Console.ReadLine(); } } } 以消除冗余?

1 个答案:

答案 0 :(得分:0)

归功于pinkfloydx33。他的评论引导我Expression<TDelegate>。我会在这里发布我的完整解决方案,以防它可能对其他人有价值。

internal static class FooConverter
{
    internal static Expression<Func<Bar, Foo>> FooToBarExpression =
        (d) => new Bar
        {
            Id = foo.Id,
            Number = foo.Number,
            Valid = foo.Valid ?? false,
        };

    internal static IQueryable<Bar> Convert(IQueryable<Foo> foos)
    {
        return foos.Select(FooToBarExpression)};
    }

    internal static Bar Convert(Foo foo)
    {
        return FooToBarExpression.Compile().Invoke(foo);
    }
}

参考:https://docs.gitlab.com/runner/executors/kubernetes.html#connecting-to-the-kubernetes-api