在LINQ查询中使用自定义方法

时间:2017-03-09 11:10:48

标签: c# linq linq-to-entities

我有这段代码:

int chunkSize = 1000;
var chunkQueryBase = _sdb.Entities.Where(m => FirstNumberGiver(m) < SecondNumberGiver(m)).OrderBy(c => c.Id);
var chunkQuery = chunkQueryBase.Take(chunkSize);

var x = chunkQuery.ToString();

var chunks = chunkQuery.ToList();

例如,FirstNumberGiver方法是这样的:

public int FirstNumberGiver(Entity entity)
{
    string numberString = entity.Number;

    string numpart1= "";
    numpart1= Regex.Match(numberString , @"\d+").Value;

    if (numpart1!= "")
    {
        return (Int32.Parse(numpart1));
    }
    else return 0;
}

SecondNumberGiver函数与FirstNumberGiver非常相似。代码在这一行给出了异常:

var chunks = chunkQuery.ToList();

例外是:

  

LINQ to Entities无法识别方法'Int32 FirstNumberGiver(Entity)'方法,并且此方法无法转换为商店表达式。

这个问题有解决方案吗?我怎样才能摆脱这个错误?

2 个答案:

答案 0 :(得分:0)

您的代码生成一个SQL查询,该查询使用SQL不知道的函数FirstNumberGiver和SecondNumberGiver,最简单的修复(但性能最差)将使用_sdb.Entities.ToList获取内存中的所有实体()并在

后过滤它们
var chunkQueryBase = _sdb.Entities.ToList().Where(m => FirstNumberGiver(m) < SecondNumberGiver(m)).OrderBy(c => c.Id);

答案 1 :(得分:0)

您可以先从数据库中查询数据,然后按以下方式对其进行过滤:

var chunkQueryBase = _sdb.Entities.ToList();
var resultSet = chunkQueryBase 
                .Where(m => FirstNumberGiver(m) < SecondNumberGiver(m))
                .OrderBy(c => c.Id);

希望有所帮助:)