以下是我使用的代码,但它回复了
方法'布尔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();
}
}
答案 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
};