我正在使用Roslyn在具有定义的业务对象(比如PEM
)上生成Linq表达式
p12
要编译Customer
的Roslyn代码是-
public class Customer
{
public List<Order> Orders { get; set; }
}
生成的Linq表达式如下。
C# code
该类还具有以下用途
var linqType = typeof(System.Linq.Enumerable);
List<MetadataReference> metadataReferences = new List<MetadataReference>()
{
//Other business DLLs as well
MetadataReference.CreateFromFile(linqType.Assembly.Location)
};
//mscorlib
car dlls = AppContext.GetData("TRUSTED_PLATFORM_ASSEMBLIES").ToString().Split(new char[] { ';' });
foreach (var platformDLL in dlls)
{
metadataReferences.Add(MetadataReference.CreateFromFile(platformDLL));
}
// Removed: Get Units
var compilationOptions = new CSharpCompilationOptions(OutputKind.DynamicallyLinkedLibrary,
optimizationLevel: OptimizationLevel.Debug,
assemblyIdentityComparer: DesktopAssemblyIdentityComparer.Default,
allowUnsafe: true);
compilationOptions.WithUsings(GetNamespaces());
var compilation = CSharpCompilation.Create(assemblyName: "customer",
syntaxTrees: units.Select(x => x.SyntaxTree).ToArray(),
references: metadataReferences,
options: compilationOptions);
但是,我仍然遇到错误
Exists<Customer>(f => f.Orders.Any() == true)
可以正确生成代码,但是使用Roslyn的代码编译失败,并出现上述错误。当我在Visual Studio中复制粘贴生成的代码时,编译没有错误
答案 0 :(得分:2)
听起来您创建了一个MemberAccessExpression
,其成员名为Orders.Any()
。
MemberAccessExpression只能使用一个成员;您需要该链的两个嵌套表达式。