C# LINQ表达式节点类型';调用&x27;在LINQ to实体中不支持

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

我在尝试实现过滤表达式以过滤实体列表时遇到问题:

LINQ to中不支持LINQ表达式节点类型“Invoke” 实体

代码如下:

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));
        }
    }

}