在LINQ Query中调用一个方法

时间:2013-01-09 08:37:38

标签: asp.net-mvc-3 linq c#-4.0

我有一个带自定义模型的LINQ查询。我只是想使用一种方法为模型属性赋值。但是当我尝试使用自定义模型时,它会抛出一些错误信息:

  

LINQ to Entities无法识别方法'System.String GetPONo(Ent,System.String)'方法,并且此方法无法转换为商店表达式。

代码

var model = (from p in db.PoDetails
             select new porders
             {
                 Category = p.Category,
                 PONO = GetPONo(p, p.Category),
              }).ToList();

方式

public string GetPONo(PoDetail p, string ASD)
{
    if (ASD == "B")
    {
        var PoNo = (from pord in db.Porders where pord.Id == p.PoId select pord.No).FirstOrDefault();
        return PoNo;
    }
    else
    {
        var PoNo = (from porder in db.Porders
                    where porder.Id == (from rec in db.RecommendResources where rec.Id == p.BibId select rec.PoId).FirstOrDefault()
                    select porder.No).FirstOrDefault();
        return PoNo;
    }
}

2 个答案:

答案 0 :(得分:6)

这是因为LINQ to Entities在后台被转换为SQL。当然,SQL中没有GetPONo(p, p.Category)方法,因此您的代码将失败。您可以通过调用ToList()来强制查询在select之前运行来解决此问题。

var model = (from p in db.PoDetails select p).ToList();
model = from m in model
        select new porders
        {
            Category = m.Category,
            PONO = GetPONo(m, m.Category)
        };

您可以查看我对类似问题here

的回答

答案 1 :(得分:1)

您可以使用三元运算符为PONO执行不同的子查询,具体取决于类别值

var model = (from p in db.PoDetails
             select new porders
             {
                 Category = p.Category,
                 PONO = p.Category == "B" ?
                        (from pord in db.Porders 
                         where pord.Id == p.PoId 
                         select pord.No).FirstOrDefault() :
                        (from porder in db.Porders
                         where porder.Id == (from rec in db.RecommendResources 
                                             where rec.Id == p.BibId 
                                             select rec.PoId).FirstOrDefault()
                         select porder.No).FirstOrDefault()
             }).ToList();

您也可以为此创建存储过程。