首页 > 解决方案 > LINQ的EBNF还是BNF?连接的关联性?其他条款?

问题描述

我正在寻找 LINQ 的 BNF 或 EBNF。似乎 C# 的语法规范在任何地方都不容易获得,但是如果没有找到,LINQ 片段可能很容易推断。

特别是,我无法弄清楚联接的优先级/关联性。请注意,连接可能包括嵌套查询,例如:

var result = from a in T 
             join b in B on a.key equals b.key
             join c in C on ??? 
             where ... 
             ...

这是我到目前为止提出的语法:

<Query> ::= <From> <Body>
<Body> ::= <Clause>* <Conclusion> <Continutation>?
<Clause> ::= <From> | <Join> | <Let> | <Order> | <OrderBy>
<From> ::= "from " <Item> "in " <Source> 
<Join> ::= "join " <Item> "in " <Source> "on " <Key> "equals " <Key> ( "into " <Item> )?
<Let> ::= "let " <Item> " = " <Selection> 
<Order> ::= "where " <Condition> 
<OrderBy> ::= "orderby " ( <Key> ( "ascending " | "descending " )?)+
<Conclusion> ::=  <Select> | <Group> 
<Select> ::= " select " <Selection> 
<Group> ::= " group " <Selection> "by " <Key> 
<Continutation> ::= "into " <Item> <Body> 
<Item> ::= "x" [0-9]+ " "
<Source> ::= "DB" [0-9]+  <Id> " "
<Selection> ::= "new " "{ " <Fields> "} "
<Key> ::= "K" [0-9]+  <Id> " "
<Condition> ::= <And>
<And> ::= <Or> ( " && " <Or> )
<Or>  ::= <Not> ( " || " <Not> )
<Not> ::= " !"? ( "(" <Condition> ")" | <Comparison> )  
<Comparison> ::= <Value> ( "<" | ">" | "==" | "<=" | ">=" | "!=" ) <Value>
<Value> ::= <Key> | <Number>
<Number> ::= [0-0] | ( [1-9] [0-9]*  )
<Fields> ::= <Field> (", " <Field>)*
<Field> ::= "F" <Item>
<Id> ::= ( [a-z] | [A-Z] ) ( E | ( [0-9] | [A-Z] | [a-z] ) ) 

你可以在这里玩这个语法:https://bnfplayground.pauliankline。com/?bnf=%3CQuery%3E%20%3A%3A%3D%20%3CFrom%3E%20%3CBody%3E%0A%3CBody%3E%20%3A%3A%3D%20%3Clause%3E* %20%3C结论%3E%20%3C继续%3E%3F%0A%3C子句%3E%20%3A%3A%3D%20%3CFrom%3E%20%7C%20%3CJoin%3E%20%7C%20 %3CLet%3E%20%7C%20%3COrder%3E%20%7C%20%3COrderBy%3E%0A%3CFrom%3E%20%3A%3A%3D%20%22from%20%22%20%3CItem %3E%20%22in%20%22%20%3CSource%3E%20%0A%3CJoin%3E%20%3A%3A%3D%20%22join%20%22%20%3CItem%3E%20%22in %20%22%20%3CSource%3E%20%22on%20%22%20%3CKey%3E%20%22equals%20%22%20%3CKey%3E%20(%20%22into%20%22% 20%3CItem%3E%20)%3F%0A%3CLet%3E%20%3A%3A%3D%20%22let%20%22%20%3CItem%3E%20%22%20%3D%20%22 %20%3CSelection%3E%20%0A%3COrder%3E%20%3A%3A%3D%20%22where%20%22%20%3CCondition%3E%20%0A%3COrderBy%3E%20%3A%3A %3D%20%22orderby%20%22%20(%20%3CKey%3E%20(%20%22ascending%20%22%20%7C%20%22descending%20%22%20)%3F)%2B %0A%3C结论%3E%20%3A%3A%3D%20%20%3C选择%3E%20%7C%20%3CGroup%3E%20%0A%3CSelect%3E%20%3A%3A%3D%20%22%20select%20%22%20%3CGroup%3E%20%0A%3CGroup%3E% 20%3A%3A%3D%20%22%20group%20%22%20%3Cselection%3E%20%22by%20%22%20%3CKey%3E%20%0A%3CContinuation%3E%20%3A% 3A%3D%20%22into%20%22%20%3CItem%3E%20%3CBody%3E%20%0A%3CItem%3E%20%3A%3A%3D%20%22x%22%20%5B0- 9%5D%2B%20%22%20%22%0A%3CSource%3E%20%3A%3A%3D%20%22DB%22%20%5B0-9%5D%2B%20%20%3CId% 3E%20%22%20%22%0A%3CSelection%3E%20%3A%3A%3D%20%22new%20%22%20%22%7B%20%22%20%3CFields%3E%20% 22%7D%20%22%0A%3CKey%3E%20%3A%3A%3D%20%22K%22%20%5B0-9%5D%2B%20%20%3CId%3E%20%22% 20%22%0A%3C条件%3E%20%3A%3A%3D%20%3CAnd%3E%0A%3CAnd%3E%20%3A%3A%3D%20%3COr%3E%20(%20%22 %20%26%26%20%22%20%3COr%3E%20)%0A%3COr%3E%20%20%3A%3A%3D%20%3CNot%3E%20(%20%22%20 %7C%7C%20%22%20%3CNot%3E%20)%0A%3CNot%3E%20%3A%3A%3D%20%22%20!%22%3F%20(%20%22(%22%20%3C条件%3E%20%22)%22%20%7C%20%3C比较%3E%20)%20%20%0A%3C比较%3E %20%3A%3A%3D%20%3C值%3E%20(%20%22%3C%22%20%7C%20%22%3E%22%20%7C%20%22%3D%3D% 22%20%7C%20%22%3C%3D%22%20%7C%20%22%3E%3D%22%20%7C%20%22!%3D%22%20)%20%3C值% 3E%0A%3CValue%3E%20%3A%3A%3D%20%3CKey%3E%20%7C%20%3CNumber%3E%0A%3CNumber%3E%20%3A%3A%3D%20%5B0- 0%5D%20%7C%20(%20%5B1-9%5D%20%5B0-9%5D*%20%20)%0A%3CFields%3E%20%3A%3A%3D%20%3CField %3E%20(%22%2C%20%22%20%3CField%3E)*%0A%3CField%3E%20%3A%3A%3D%20%22F%22%20%3CItem%3E%0A% 3CId%3E%20%3A%3A%3D%20(%20%5Ba-z%5D%20%7C%20%5BA-Z%5D%20)%20(%20E%20%7C%20(% 20%5B0-9%5D%20%7C%20%5BA-Z%5D%20%7C%20%5Ba-z%5D%20)%20)%20&name=Real%20Numbersname=Real%20Numbersname=Real%20Numbers%3D%22%20)%20%3CValue%3E%0A%3CValue%3E%20%3A%3A%3D%20%3CKey%3E%20%7C%20%3CNumber%3E%0A%3CNumber%3E% 20%3A%3A%3D%20%5B0-0%5D%20%7C%20(%20%5B1-9%5D%20%5B0-9%5D*%20%20)%0A%3C字段%3E %20%3A%3A%3D%20%3CField%3E%20(%22%2C%20%22%20%3CField%3E)*%0A%3CField%3E%20%3A%3A%3D%20% 22F%22%20%3CItem%3E%0A%3CId%3E%20%3A%3A%3D%20(%20%5Ba-z%5D%20%7C%20%5BA-Z%5D%20)% 20(%20E%20%7C%20(%20%5B0-9%5D%20%7C%20%5BA-Z%5D%20%7C%20%5Ba-z%5D%20)%20)% 20&name=Real%20 个数字%3D%22%20)%20%3CValue%3E%0A%3CValue%3E%20%3A%3A%3D%20%3CKey%3E%20%7C%20%3CNumber%3E%0A%3CNumber%3E% 20%3A%3A%3D%20%5B0-0%5D%20%7C%20(%20%5B1-9%5D%20%5B0-9%5D*%20%20)%0A%3C字段%3E %20%3A%3A%3D%20%3CField%3E%20(%22%2C%20%22%20%3CField%3E)*%0A%3CField%3E%20%3A%3A%3D%20% 22F%22%20%3CItem%3E%0A%3CId%3E%20%3A%3A%3D%20(%20%5Ba-z%5D%20%7C%20%5BA-Z%5D%20)% 20(%20E%20%7C%20(%20%5B0-9%5D%20%7C%20%5BA-Z%5D%20%7C%20%5Ba-z%5D%20)%20)% 20&name=Real%20 个数字

例如,您可以基于此语法生成示例查询。

标签: linq

解决方案


本文档指定查询语法:

query_expression
    : from_clause query_body
    ;

from_clause
    : 'from' type? identifier 'in' expression
    ;

query_body
    : query_body_clauses? select_or_group_clause query_continuation?
    ;

query_body_clauses
    : query_body_clause
    | query_body_clauses query_body_clause
    ;

query_body_clause
    : from_clause
    | let_clause
    | where_clause
    | join_clause
    | join_into_clause
    | orderby_clause
    ;

let_clause
    : 'let' identifier '=' expression
    ;

where_clause
    : 'where' boolean_expression
    ;

join_clause
    : 'join' type? identifier 'in' expression 'on' expression 'equals' expression
    ;

join_into_clause
    : 'join' type? identifier 'in' expression 'on' expression 'equals' expression 'into' identifier
    ;

orderby_clause
    : 'orderby' orderings
    ;

orderings
    : ordering (',' ordering)*
    ;

ordering
    : expression ordering_direction?
    ;

ordering_direction
    : 'ascending'
    | 'descending'
    ;

select_or_group_clause
    : select_clause
    | group_clause
    ;

select_clause
    : 'select' expression
    ;

group_clause
    : 'group' expression 'by' expression
    ;

query_continuation
    : 'into' identifier query_body
    ;

推荐阅读