C# LINQ表达式节点类型';调用&x27;在LINQ to实体中不支持
我在尝试实现过滤表达式以过滤实体列表时遇到问题: LINQ to中不支持LINQ表达式节点类型“Invoke” 实体 代码如下:C# LINQ表达式节点类型';调用&x27;在LINQ to实体中不支持,c#,.net,linq-to-entities,linq-expressions,C#,.net,Linq To Entities,Linq Expressions,我在尝试实现过滤表达式以过滤实体列表时遇到问题: LINQ to中不支持LINQ表达式节点类型“Invoke” 实体 代码如下: public IList<DocumentEntry> GetDocumentEntriesForRateAdjustmentTry2( string username, Rate rate, List<RatePeriod> ratePeriods) { var dimensionLibManager = new Dimens
public IList<DocumentEntry> GetDocumentEntriesForRateAdjustmentTry2(
string username, Rate rate, List<RatePeriod> ratePeriods)
{
var dimensionLibManager = new DimensionLibManager();
var currentVersionRateGroups = rate.CurrentRateVersion.RateGroups.ToList();
Expression<Func<DocumentEntry, IList<RateGroup>, int, bool>> dimensionMatchesExpression =
(documentEntry, rateGroups, dimensionInfoId) =>
rateGroups.Any(
rg =>
rg.Dimension1.All(character => character == '*')
||
documentEntry.DocumentEntryDimensions.Any(
ded =>
ded.DimensionInfo.Position == dimensionInfoId
&&
dimensionLibManager.GetDimensionSegments(rate.CompanyId, username, dimensionInfoId, ded.Value).Any(
seg => ded.Value.Substring(seg.SegmentStart, seg.SegmentLength) == seg.SegmentValue)));
var dimensionMatches = dimensionMatchesExpression.Compile();
var documentEntries = this.ObjectSet.Where(de => dimensionMatches(de, currentVersionRateGroups, 1));
var result = documentEntries.ToList(); // The error happens here.
return result;
}
还有,我如何调试这种问题呢?错误信息相当模糊。如何找到导致错误的确切节点?我怀疑这就是问题所在
var documentEntries = this.ObjectSet.Where(de => dimensionMatches(de, currentVersionRateGroups, 1));
我认为行号不适用于Linq2EF
public IList<DocumentEntry> GetDocumentEntriesForRateAdjustmentTry2(
string username, Rate rate, List<RatePeriod> ratePeriods)
{
var dimensionLibManager = new DimensionLibManager();
var currentVersionRateGroups = rate.CurrentRateVersion.RateGroups.ToList();
Expression<Func<DocumentEntry, int, bool>> dimensionMatchesExpression =
(documentEntry, rateGroups, dimensionInfoId) =>
currentVersionRateGroups.Any(
rg =>
rg.Dimension1.All(character => character == '*')
||
documentEntry.DocumentEntryDimensions.Any(
ded =>
ded.DimensionInfo.Position == dimensionInfoId
&&
dimensionLibManager.GetDimensionSegments(rate.CompanyId, username, dimensionInfoId, ded.Value).Any(
seg => ded.Value.Substring(seg.SegmentStart, seg.SegmentLength) == seg.SegmentValue)));
var documentEntries = this.ObjectSet.Where(dimensionMatchesExpression);
var result = documentEntries.ToList(); // The error happens here.
return result;
}
public IList GetDocumentEntries for Rate AdjustmentTRY2(
字符串用户名、费率、列表费率周期)
{
var dimensionLibManager=新的dimensionLibManager();
var currentVersionRateGroups=rate.CurrentRateVersion.RateGroups.ToList();
表达式维度匹配表达式=
(documentEntry、RateGroup、dimensionInfoId)=>
currentVersionRateGroups。任何(
rg=>
rg.Dimension1.All(字符=>字符=='*'))
||
documentEntry.DocumentEntryDimensions.Any(
ded=>
ded.DimensionInfo.Position==dimensionInfoId
&&
dimensionLibManager.GetDimensionSegments(rate.CompanyId、用户名、dimensionInfoId、ded.Value)。任何(
seg=>ded.Value.Substring(seg.SegmentStart,seg.SegmentLength)==seg.SegmentValue));
var documentEntries=this.ObjectSet.Where(dimensionMatchesExpression);
var result=documentEntries.ToList();//错误发生在这里。
返回结果;
}
虽然我不明白你为什么要用一个表达式来做这个。你可以把它全部内联起来
几天前刚刚意识到你的问题的解决方案…有点黑客
public Expression<Func<DocumentEntry, int, bool>> CreateWhereClause(stuff);
public IList<DocumentEntry> GetDocumentEntriesForRateAdjustmentTry2(
string username, Rate rate, List<RatePeriod> ratePeriods)
{
using(var db = new Context())
{
IQueryable<DocumentEntry> foo = db.Foos;
foreach(var i =0; i <4; i++)
{
foo = foo.Where(DocumentEntry(i));
}
}
}
公共表达式createwhere子句(stuff);
public IList GetDocumentEntries for Rate AdjustmentTRY2(
字符串用户名、费率、列表费率周期)
{
使用(var db=new Context())
{
IQueryable foo=db.Foos;
弗雷奇(var i=0;我编辑了我的问题来解释我为什么要使用表达式。没有办法。只适用于LINQ to对象。根本问题是lambda表达式和lambda函数之间的区别。Where函数参数的内部当前有一个lambda函数,其中包含一个lambda表达式。您需要一个纯exp用于此查询的表达式树。组合表达式非常困难。
public Expression<Func<DocumentEntry, int, bool>> CreateWhereClause(stuff);
public IList<DocumentEntry> GetDocumentEntriesForRateAdjustmentTry2(
string username, Rate rate, List<RatePeriod> ratePeriods)
{
using(var db = new Context())
{
IQueryable<DocumentEntry> foo = db.Foos;
foreach(var i =0; i <4; i++)
{
foo = foo.Where(DocumentEntry(i));
}
}
}