试图在linq语句的位置调用一个方法

时间:2012-01-11 09:10:31

标签: c# .net linq linq-to-sql

以下是我使用的代码,但它回复了

  

方法'布尔isUser(System.String)'没有受支持的SQL翻译。

有任何帮助吗?顺便说一句,我使用 linq to SQL 数据源

public void dataBind()
{
    using (var gp = new GreatPlainsDataContext())
    {
        var emp = from x in gp.Employees
                  let k = isUser(x.ID)
                  where x.ActivtyStatus == 0
                  && isUser(x.ID) != false
                  orderby x.ID
                  select new
                  {
                      ID = x.ID,
                      Name = x.FirstName + " " + x.MiddleName
                  };
        ListView1.DataSource = emp;
        ListView1.DataBind();
    }
}

public static bool isUser(string ID)
{
    int temp;
    bool x = int.TryParse(ID, out temp);
    return x;
}

我找到了一个解决方案,可以将第一个查询的结果作为对象进行查询,但这是一个很好的原因,我会两次通过我的数据。


根据Anders Abel建议使用之后最终工作的更新代码

public void dataBind()
    {
        using (var gp = new GreatPlainsDataContext())
        {
            var emp = from x in gp.Employees
                      where x.ActivtyStatus == 0
                      && SqlMethods.Like(x.ID, "[0-9]%")
                      orderby x.ID
                      select new
                      {
                          ID = x.ID,
                          Name = x.FirstName + " " + x.MiddleName
                      };
            ListView1.DataSource = emp;
            ListView1.DataBind();
        }
    }

5 个答案:

答案 0 :(得分:6)

Linq-to-sql将查询转换为SQL。它只知道如何翻译一组有限的内置函数。您必须重写您的查询,以便不包含您自己的功能。

可以在MSDN找到linq-to-sql支持的函数和运算符的完整列表。

您可以使用SqlMethods.Like()检查字段是否仅包含数字。有关示例,请参阅T-SQL IsNumeric() and Linq-to-SQL

答案 1 :(得分:3)

您遇到的问题是,由于查询需要在数据库上运行,您只能使用可在数据库上运行的内容,因此isUser方法中的C#代码无法运行数据库。

您必须在不使用该功能的情况下重新编写它。也许您有一个表格列出了您可以加入的ID的用户?

答案 2 :(得分:0)

您可以更轻松地查询ID对您有效,例如 where ID > 0,恢复结果,然后在结果集合上执行您想要的假设过滤器

isUser(x.ID)

因为,我认为,它以某种方式执行更复杂的验证。

重要的是,来自数据库结果的数据可能,以避免数据传输延迟。

答案 3 :(得分:0)

您可以调用此代码:

var emp = from x in gp.Employees
                  where x.ActivtyStatus == 0
                  orderby x.ID

并获得有效的结果,因为每个linq表达式都可以通过linq到sql应用于Employees。然后,您可以将emp转换为列表或数组,并使用您的方法isUser过滤集合。

答案 4 :(得分:0)

作为替代解决方案,您可以在gp.isUser(x.ID)等LINQ查询中内联调用任何sql UDF(用户定义函数),因此您可以将此函数isUser定义为SQL UDF,如下所示:

 CREATE FUNCTION isUser(@id int)
 RETURNS bit;
 AS
 BEGIN
    if exists(select * from Users where userId = @id)
    begin 
          return 1; --true the user exists;
    else 
          return 0; --false doesn't exist;
    end
 end

然后你必须define this UDF in your .DBML file包含其他表和过程定义映射。然后你可以在你的LINQ查询中Call it or any other UDF function inline像这样:

var emp = from x in gp.Employees
              let k = gp.isUser(x.ID)
              where x.ActivtyStatus == 0
              && gp.isUser(x.ID) != 1
              orderby x.ID
              select new
              {
                  ID = x.ID,
                  Name = x.FirstName + " " + x.MiddleName + " " + x.LastName
              };