2011-03-06 69 views
2
//my question is here 
public static Query Where<TElement>(this Query query, Func<TElement, bool> predicate) 
{ 
    query.sql +=" FROM Table WHERE "+ predicate+";"; 
    return query; 
} 

//Query class 
public class Query 
{ 
    public Query(){} 
    public Query(string sql){this.sql = sql;} 
    public string sql { set; get; } 
} 

//User class 
public class User 
{ 
    public int ID { get; set; } 
    public string Name { get; set; } 
} 

//example: 
User user = new User() { ID=1,Name="test"}; 
Query query = new Query(); 
query = query.Where<User>(u=>u.ID==user.ID); 
Console.WriteLine(query.sql); 

运行后,其结果是:约Func键<TElement,bool>的谓词

FROM Table WHERE System.Func'2[DAL.User,System.Boolean]'; 

但我需要的是:

FROM Table WHERE ID=1; 

有人能帮助我吗?

+0

你能解释这部分是在哪里进来吗? 'U => u.ID == user.ID'。你只想给这个ID,如果它匹配,否则你想要什么? – 2011-03-06 03:06:37

+0

首先,如果你想解析谓词,它必须是'Expression >'类型,我的下一个问题是你的目标是什么?如果你正在使用Linq To Sql的问题标签陈述你为什么要重新创造'Where'? – 2011-03-06 03:10:43

+0

我想知道linq怎么做 – artwl 2011-03-06 03:12:32

回答

3

如果您想了解Linq to Sql如何构建SQL查询,您的第一步将学习关于Expression Trees

下一步将会对ExpressionVisitor有所了解,这将有助于您如何访问表达式树中的每一部分。

从那里通过博客系列"LINQ: Building an IQueryable provider series"阅读了解如何将表达式树解析为sql。

"Where and reusable Expression tree visitor"将帮助你如何解析你的谓词。现在

,因为你将不会被IQueryable<T>.Where()工作,但只是在Expression<Func<T, bool>>这些职位并不是一切都将完全涉及,但应该是一个良好的开端如何where子句解析谓词表达成一个有效的SQL。

希望这可以让你开始!

+0

您的参考资料比我的更好。提问者,请按照这些链接! – Jollymorphic 2011-03-06 03:31:46

+0

您认为在这里可以使用Edulinq的链接吗?它描述了Linq2Objects,但仍将大致概述Linq如何实现。 http://msmvps.com/blogs/jon_skeet/archive/tags/Edulinq/default.aspx我不想写一个新问题来补充,但如果您认为它有用,请随时将其编辑到您的答案中。欢呼 – 2011-03-06 03:45:05

1

看来您正在尝试使您的Query类可以在LINQ中访问,在这里。当你参与LINQ Where子句时,你得到的谓词是一个函数对象,而不是一个字符串。其思想是将谓词函数应用于枚举的每个元素,并返回yield - 仅返回函数返回“true”的元素。

LINQ-to-SQL查看这样的谓词内的代码,它假定它是一个可以分析并转换为SQL表达式的表达式(例如,lambda表达式)。请记住,编译器可以将C#lambda生成到委托或表达式树中(请参阅this MSDN topic),具体取决于表达式中预期的类型。因此,LINQ-to-SQL在其他工作中做了大量工作字,将该谓词转化为可以针对数据库引擎运行的东西。

如果你真的想要LINQ,你可能只需要获取查询中的所有记录,然后用谓词过滤它们,除非这代表了缩放问题(取决于你的应用程序的严重性)。此外,你必须编写一个适当的Where函数,它返回一个IEnumerable对象并使用yield-return。请参阅this tutorial page(您将不得不向下滚动)或阅读简明书中出色的C#中的LINQ章节。另一方面,如果你实际上并不关心LINQ,并且这段代码只是巧合地LINQ-y,那么只要将你的参数类型改为字符串,然后在你想使用的表达式周围加上引号即可。

相关问题