当前位置:编程学习 > C#/ASP.NET >>

linq 的一个用户函数的问题

from n in source
   where Check(n.version)>6
orderby n.version
   select n

这个运行时会报错,说不支持转换为SQL。

这里source是从数据库里获取的版本列表,要找出所有版本大于6的数据。我就写了个C#的方法,用来把版本号转换为数字。
有谁可以说下要怎么解决啊,不能把这个方法做成存储过程或者数据库函数。


对于数组,上面的是可以运行,但是对于linq to sql就不可以了。

求帮助。新人,麻烦尽量说详细点。 --------------------编程问答-------------------- LZ先把这个转换为SQL,如果SQL能写得出来,那么使用LINQ才有可能写得出来,而且还仅仅是有可能。

要记住,LINQ在执行数据库查询时,也是要转化为SQL去查询的,你给出的Check()对于SQL来说根本
就是一个不存在的东西,当然无法转换了, 这对于 LINQ to SQL 和 ADO.NET Entity Framework
都是一样的。 --------------------编程问答--------------------
引用 1 楼 sunpire 的回复:
LZ先把这个转换为SQL,如果SQL能写得出来,那么使用LINQ才有可能写得出来,而且还仅仅是有可能。

要记住,LINQ在执行数据库查询时,也是要转化为SQL去查询的,你给出的Check()对于SQL来说根本
就是一个不存在的东西,当然无法转换了, 这对于 LINQ to SQL 和 ADO.NET Entity Framework
都是一样的。

学习了 --------------------编程问答-------------------- 学习。。学习。。 --------------------编程问答--------------------
引用 1 楼 sunpire 的回复:
LZ先把这个转换为SQL,如果SQL能写得出来,那么使用LINQ才有可能写得出来,而且还仅仅是有可能。

要记住,LINQ在执行数据库查询时,也是要转化为SQL去查询的,你给出的Check()对于SQL来说根本
就是一个不存在的东西,当然无法转换了, 这对于 LINQ to SQL 和 ADO.NET Entity Framework
都是一样的。

其实我的这个check方法就是这样的
private static int Check(string version)
        {
            var result = 10000000;
            string[] array = version.Split('.');

result = int.Parse(array[0].PadLeft(2, '0') + array[1].PadLeft(2, '0') + array[2].PadLeft(2, '0') + array[3].PadLeft(3, '0'));

           return result;
        } --------------------编程问答-------------------- 一些类型的数据可能无法直接转换为SQL。
无法在LINQ的表达式中使用 --------------------编程问答-------------------- 将你的Check()做成一个sql函数
还有你的linq语句也有问题,查询数据库,怎么没有建立数据上下文
使用数据库函数(首先要拖到dbml文件中)的例子:
using (DataContext mycon = new DataSetDataContext())
{
var data=from n in mycon.source
         where mycon.Check(n.version)>6
         orderby n.version
         select n;
} --------------------编程问答--------------------

var query=from n in source
orderby n.version
  select n

foreach(var q in query)
{
  if(Check(q.version)>6) 
{
   //do something
}
}
--------------------编程问答--------------------
引用 6 楼 zhangyumei 的回复:
将你的Check()做成一个sql函数
还有你的linq语句也有问题,查询数据库,怎么没有建立数据上下文
使用数据库函数(首先要拖到dbml文件中)的例子:
using (DataContext mycon = new DataSetDataContext())
{
var data=from n in mycon.source
  where mycon.Check(n.versio……


是有上下文的,我这里是为了叙述方便,把不重要的给省略掉了,这样可以只关注重要的地方。 --------------------编程问答--------------------
引用 7 楼 q107770540 的回复:
C# code

var query=from n in source
orderby n.version
  select n

foreach(var q in query)
{
  if(Check(q.version)>6) 
{
   //do something
}
}

这个思路很好,有点点问题就是,这个做法是取出所有的记录,然后遍历循环判断。实际项目中数据量有1w多数据,但是期待的每次查询结果只有最多3条记录,这样的话可能会有性能问题。而且随着source的数据量越来越大,性能最后可能会非常的差。 --------------------编程问答--------------------
引用 9 楼 mmcer 的回复:
引用 7 楼 q107770540 的回复:
C# code

var query=from n in source
orderby n.version
select n

foreach(var q in query)
{
if(Check(q.version)>6)
{
//do something
}
}

这个思路很好,有点点问题就是,这个做法是取出所有的记……

那你只有将查询的逻辑封装在存储过程中进行调用了 --------------------编程问答-------------------- 把 Check 的 static 去掉就可以了。要不你用 ClassName.Check 再试试 --------------------编程问答--------------------
引用 1 楼 sunpire 的回复:
LZ先把这个转换为SQL,如果SQL能写得出来,那么使用LINQ才有可能写得出来,而且还仅仅是有可能。

要记住,LINQ在执行数据库查询时,也是要转化为SQL去查询的,你给出的Check()对于SQL来说根本
就是一个不存在的东西,当然无法转换了, 这对于 LINQ to SQL 和 ADO.NET Entity Framework
都是一样的。


不必费时间了,where不能引用自定义函数。 --------------------编程问答-------------------- --------------------编程问答-------------------- pavee
说的是,只能转换成sql语句再想转化成linq --------------------编程问答--------------------
引用 1 楼 sunpire 的回复:
LZ先把这个转换为SQL,如果SQL能写得出来,那么使用LINQ才有可能写得出来,而且还仅仅是有可能。

要记住,LINQ在执行数据库查询时,也是要转化为SQL去查询的,你给出的Check()对于SQL来说根本
就是一个不存在的东西,当然无法转换了, 这对于 LINQ to SQL 和 ADO.NET Entity Framework
都是一样的。


大家都这么高端的呢,学习了。sql不能实现的地方linq又怎么能实现?
补充:.NET技术 ,  LINQ
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,