2013-12-04 3 views
2

Большинство выражений в Linq могут быть записаны в двух синтаксисах.
В принципе, Метод-синтаксис и SQL-подобный синтаксис.Чем больше «SQL-синтаксис» Linq.Except

Например:

Метод-синтаксис:
var results = MySet.Where(n => n.Status == State.ACTIVE);

SQL-подобный синтаксис-:
var results = from n in MySet where n.Status == State.ACTIVE select n;

Я хотел бы использовать .Except в SQL- подобный синтаксис, но может найти только примеры в Интернете, где он используется в синтаксисе Method.

Пример:

int[] numbers = Enumerable.Range(1,20).ToArray(); 
int[] primes = new[] { 2, 3, 5, 7, 11, 13, 17 }; 

//var composites = from n in numbers select n except primes; // This does not work. 
var composites = numbers.Except(primes);      // This works 
return composites; 

Вопросы
Существуют ли официальные названия для чего я звоню метод, синтаксис и SQL-подобный синтаксис-?
Есть ли способ сделать SQL-подобный синтаксис на операции except?

+0

Похоже, что это называется «Синтаксис запроса». Почему вы хотите использовать синтаксис запроса? http://msdn.microsoft.com/en-us/library/bb397947.aspx – JMooney

ответ

3

Существуют ли формальные имена для того, что я называю формой метода и SQL-подобным синтаксису ?

Да один метод Синтаксис и другой (SQL как) является синтаксис запроса (выражение запроса написано в sytnax запроса).

LINQ Query Expressions (C# Programming Guide)

Запрос выражения записаны в синтаксисе декларативного запроса введенный в С # 3.0.

См: Query Syntax and Method Syntax in LINQ (C#)

Для другого вопроса:

Есть ли способ сделать SQL-подобный синтаксис-на, кроме работы?

Нет. Я не видел Except с синтаксисом запроса.

См: Query Syntax and Method Syntax in LINQ (C#)

Большинство запросов в вводном Language Integrated Query (LINQ) документации написаны с использованием синтаксиса декларативного запроса LINQ. Однако, когда код компилируется, синтаксис запроса должен быть переведен в вызовы методов для среды выполнения (CLR) . Эти вызовы метода вызывают стандартные операторы запроса, которые имеют имена , такие как Где, выберите, GroupBy, Join, Max и Average.Вы можете использовать , используя синтаксис метода вместо синтаксиса запроса.

Похоже, что вы можете использовать только Where, Select, GroupBy, Join, Max, and Average с синтаксисом запроса.

+1

Максимальное и среднее значение не могут использоваться в синтаксисе запроса на C#. (Возможно, они могут быть в VB, что, вероятно, является источником этой ошибки). – Servy

5

Единственные методы с поддержкой синтаксиса LINQ в C# являются:

Where  // where 
Select  // select/let 
SelectMany // from 
Join  // join 
GroupBy // group by 
GroupJoin // join into 

И даже не все перегруженные тех. Для всего остального вы застряли, называя методы самостоятельно.

Единственный способ выполнить запрос, используя синтаксис LINQ, чтобы поменять Except для GroupJoin:

int[] numbers = Enumerable.Range(1, 20).ToArray(); 
int[] primes = new[] { 2, 3, 5, 7, 11, 13, 17 }; 

var composites = from n in numbers 
       join p in primes on n equals p into grp 
       where !grp.Any() 
       select n; 

Это, вероятно, не стоит, хотя - это будет несколько менее эффективным и, возможно, не сразу понятным для тех, у кого нет четкого понимания LINQ.

F # поддерживает гораздо больший набор query expressions. Хотелось бы, чтобы они довели кое-что до C#.

2

Вы можете попробовать комбинацию синтаксиса запроса и метода.

var numbers = Enumerable.Range(1, 20).ToArray(); 
var primes = new[] { 2, 3, 5, 7, 11, 13, 17 }; 

var composites = from n in numbers 
       where !(primes.Contains(n)) 
       select n;