LINQ to Entities自定义方法

时间:2016-12-28 11:04:38

标签: c# .net entity-framework linq

在我的代码中,我有:

context.TableA
            .Where(x =>
                x.Created >= startDate
                && context.TableB.RecordExists(x.Id, 1));

RecordExists的定义如下:

public static bool RecordExists(this IQueryable<TableB> entity, int entityId, int entityTypeId)
{
    return entity.Any(x => x.EntityId == entityId && x.EntityTypeId == entityTypeId);
}

上述调用失败,

  

NotSupportedException:LINQ to Entities无法识别该方法   'Boolean RecordExists(System.Linq.IQueryable`1 [TableB],Int32,Int32)'   方法,并且此方法无法转换为商店表达式。

但如果我将查询更改为:

 context.TableA
            .Where(x =>
                x.Created >= startDate
                && context.TableB.Any(p => p.EntityId == x.Id && p.EntityTypeId == 1));

它工作正常,有没有办法在查询中使用此方法?

2 个答案:

答案 0 :(得分:3)

尝试使用表达式

表达式定义

public Expression<Func<TableA, bool>> RecordExists(IEnumerable<TableB> entities, int entityTypeId)
{
    return a => entities.Any(b => b.Id == a.EntityId && b.EntityTypeId == entityTypeId);
}

示例

return context.TableA
    .Where(x => x.Created >= startDate)
    .Where(RecordExists(context.TableB, 1));

enter image description here

答案 1 :(得分:1)

Linq to SQL使用&#34; Expression Trees&#34;将lambda表达式转换为sql表达式。所以你不能使用方法,只能使用内联表达式。但是你可以使用Linq中的方法来收集它们。如果您在.ToList()上先调用TableA函数,则可以调用方法。但.ToList()函数将首先检索内存中的所有内容,然后对其进行过滤。所以这是非常不推荐的。