2012-02-01 10 views

risposta

-2

Questo non è possibile, almeno se si desidera creare query ad-hoc in Javascript. Linq (di qualsiasi sapore) è una tecnologia di compilazione. Una query che utilizza la sintassi di Linq o le espressioni di Linq viene gestita dal compilatore C# o VB, non direttamente interpretata dal database.

Un modo convenzionale per farlo sarebbe attraverso un servizio Web in C#, utilizzando Linq per recuperare e archiviare dati e presentare un'API pulita ai client. Quindi il cliente potrebbe consumare il servizio tramite chiamate AJAX.

1

Si consiglia di verificare il framework edge.js, collega node.js con .Net. Un modo sarebbe utilizzare il supporto T-SQL integrato in edge e quindi usare qualcosa come linq.js per manipolare i risultati.

var getTop10Products = edge.func('sql', function() {/* 
    select top 10 * from Products 
*/}); 

getTop10Product(null, function (error, products) { 
    if (error) throw error; 
    console.log(products); 
}); 

In caso contrario, si potrebbe configurare un DataContext EF in una libreria Net e chiamare a che l'utilizzo di Linq

var getTop10Product = edge.func(function() {/* 
    async (input) => { 
     using (var db = new ProductContext()) 
     { 
     //Linq to EF query 
     var query = from b in db.Products 
        orderby b.Name 
        select b; 
     return query.Take(10).ToList(); 
     } 
    } 
*/}); 
0

mi sono imbattuto in questa domanda oggi come mi chiedevo la stessa cosa, e dopo un po 'più di ricerca mi sono imbattuto in Squel.

Citando direttamente dal loro sito web:

//this code 
squel.select() 
    .from("students") 
    .field("name") 
    .field("MIN(test_score)") 
    .field("MAX(test_score)") 
    .field("GROUP_CONCAT(DISTINCT test_score ORDER BY test_score DESC SEPARATOR ' ')") 
    .group("name") 
); 

/* will return this SQL query as a string: 
    SELECT 
     name, 
     MIN(test_score), 
     MAX(test_score), 
     GROUP_CONCAT(DISTINCT test_score ORDER BY test_score DESC SEPARATOR ' ') 
    FROM 
     students 
    GROUP BY 
     name 
*/ 

Speriamo che questo aiuterà tutti coloro che si imbatte in questa domanda durante la ricerca.

Buona fortuna!

PS: < diniego inserto standard di non generare query SQL nel browser ... >

Se si sta creando javascript client-side che invierà una query SQL al database si apre un intero vaso di Pandora - Se il browser può dettare la query SQL e un utente può manipolare ciò che proviene dal browser, allora è vulnerabile allo SQL injection attacks.

Bottom line: non usare questo nel browser!

3

Oggi, JayData http://jaydata.org/ farlo.

È possibile utilizzare la nuova sintassi funzione ES6 freccia che sembra molto simile a C# (con un browser che lo supporta, come lastest Firefox, o un transpiler, come il dattiloscritto o Traceur):

todoDB.Todos 
    .filter(todo => todo.Completed == true) 
    .map(todo => todo.Task) 
    .forEach(taskName => $('#list') 
    .append('Task: ' + taskName + ' completed')); 

La query sarà convertito in una query SQL (select Task from Todos where Completed = true) o un parametro $ filtro URL (http://.../?$filter=Completed%20eq%201&$select=Task), a seconda dell'origine dati ...

2

Questa settimana ho iniziato con la variante JS di LINQ alle entità.Controllare UniMapperJS

Esempio

var comments = await Comment.getAll() 
.where(e => e.author.endsWith("something") || e.author.startsWith("somethingElse")) 
.orderByDescending("created") 
.limit(10) 
.skip(0) 
.exec(); 

Ma cuz di limitazione di JS, era difficile da capire, come accettare le variabili in dove perché che le funzioni di direzione vengono analizzati come stringa. L'ho risolto con la variabile "virtuale" ($) e l'elenco di argomenti come ultimo parametro.

var comments = await Comment.getAll() 
.where(e => e.author.endsWith($) || e.author.startsWith($), filter.endsWith, filter.name) 
.orderByDescending("created") 
.limit(10) 
.skip(0) 
.select(e => e.author) 
.exec();