我正在尝试使用microsoft提供的TSql100Parser解析SQL.现在我使用它似乎意图使用的方式有点麻烦.此外,缺乏文档也无济于事.(例如:http://msdn.microsoft.com/en-us/library/microsoft.data.schema.scriptdom.sql.tsql100parser.aspx)
当我通过解析器运行一个简单的SELECT语句时,它返回一个包含SELECT语句的TSqlStatements集合.麻烦的是,TSqlSelect语句不包含诸如WHERE子句之类的属性,即使该子句是作为类实现的.http://msdn.microsoft.com/en-us/library/microsoft.data.schema.scriptdom.sql.whereclause.aspx 解析器确实识别WHERE子句,查看令牌流.所以,我的问题是,我正确使用解析器吗?现在令牌流似乎是解析器最有用的功能......
我的测试项目:
public static void Main(string[] args)
{
var parser = new TSql100Parser(false);
IList<ParseError> Errors;
IScriptFragment result = parser.Parse(
new StringReader("Select col from T1 where 1 = 1 group by 1;" +
"select col2 from T2;" +
"select col1 from tbl1 where id in (select id from tbl);"),
out Errors);
var Script = result as TSqlScript;
foreach (var ts in Script.Batches)
{
Console.WriteLine("new batch");
foreach (var st in ts.Statements)
{
IterateStatement(st);
}
} …Run Code Online (Sandbox Code Playgroud) 目前正在阅读一系列关于F#的博客文章,针对C#程序员.现在我已经读完了第3部分(http://www.jelovic.com/weblog/?p=220),我感到很困惑.
和...之间的不同
让readLine = Console.ReadLine()
和
let readLine()= Console.ReadLine()
很清楚,但为什么需要指定两个括号 - () - 在以下行:
let print(text:string)()= Console.WriteLine文本
编译器是否应该能够通过省略大括号来确定您是否声明了委托打印,因此它看起来如下所示:
let print(text:string)= Console.WriteLine文本
此外,以下几行对我来说没什么意义
通常当你有一个带有不同类型参数的函数时,编译器可以区分函数调用和委托引用,但是对于单元,你必须强制它.
这是否意味着当参数不同时,编译器可以安全地假设它是一个函数调用?
谢谢大家的答案,现在我很清楚.至于报价,我们会让它休息.
我有一个对象的集合,我想使用如下所示的方法比较相等:
bool AreEqual(MyObject O1,MyObject O2);
将所有相等对象分组的最友好的表现方式是什么?显而易见的答案是将每个对象与集合中的所有其他对象进行比较,但这会影响性能(N ^ N,我相信).
LINQ group by operator能提供解决方案吗?
编辑:
我应该将MyObject命名为MyObject,因为我无法修改它的实现(并且它没有实现IComparable).这意味着我可能会使用ICR的解决方案.