๋ท๋ท์ LINQ ๊ธฐ๋ฅ์ ์๋ฐ์คํฌ๋ฆฝํธ๋ก ์ด์ฉํ๊ธฐ
LINQ (Language Integrated Query)๋ ๋ท๋ท ๊ฐ๋ฐ์ ๊ฐ์ฅ ๊ฐ๋ ฅํ ๊ธฐ๋ฅ๋ค ์ค์ ํ๋์ด๋ค. LINQ-to-SQL, LINQ-to-XML, LINQ-to-OBJECT ๋ฑ ๊ฑฐ์ ๋ชจ๋ ์ํฉ์์ LINQ๋ฅผ ์ฌ์ฉํ ์ ์๋ค. LINQ๋ ๋ณดํต ์๋์ ๊ฐ์ ํํ๋ก ๋ง์ด ์ฐ์ธ๋ค.
var products = (from p in context.Products where p.ProductName.Contains("ABC") select p).ToList();
๋๋
var products = context.Products .SingleOrDefault(p => p.ProductId == 123);
ํ์ง๋ง ์ด๊ฒ์ ๊ฐ์ฅ ํฐ ๋จ์ (?)์ด๋ผ๋ฉด, ํ๋ก ํธ์๋์์ ์ฐ์ด๋ ์๋ฐ์คํฌ๋ฆฝํธ๋ก๋ ์ด๋ฌํ ๊ธฐ๋ฅ์ ์ฌ์ฉํ ์ ์๋ค๋ ๋ฐ ์๋ค. ๊ทธ๋์ ๋ํ๋ ๊ฒ์ด ๋ฐ๋ก linq.js์ด๋ค.
linq.js ์๊ฐ
์ด ์๋ฐ์คํฌ๋ฆฝํธ ํ๋ ์์์ ์ฌ์ฉํ๋ฉด, LINQ์์ ์ ๊ณตํ๋ ๋๋ถ๋ถ์ ๊ธฐ๋ฅ๋ค์ ์๋ฐ์คํฌ๋ฆฝํธ ์์์๋ ๊ฑฐ์ ๋์ผํ ๋ฌธ๋ฒ์ผ๋ก ์ฌ์ฉํ ์ ์๋ค. ๋ํ, ์ด linq.js๋ jQuery ํ๋ฌ๊ทธ์ธ๋ ์ ๊ณตํ๋ฏ๋ก, ๋๋์ฑ ํธ๋ฆฌํ๊ฒ ์ธ ์ ์๋ค.
์ด linq.js๋ฅผ ์ฌ์ฉํ๊ธฐ ์ํด์๋ ์ฐ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๋ถ๋ฌ๋ค์ฌ์ผ ํ๋ค. ๊ธฐ์์ด๋ฉด jQuery๋ฅผ ํธ์ถํ ํ์ ์ด linq.js๋ฅผ ํธ์ถํ๋๋ก ํ์.
<script src="/path/to/linq.js"></script> <script src="/path/to/linq.jquery.js"></script>
์ด๋ ๊ฒ ํธ์ถํด ๋์ผ๋ฉด ๊ทธ๋ฅ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค. ๋๋ต์ ์ฌ์ฉ ๋ฐฉ๋ฒ์ ์๋์ ๊ฐ๋ค.
var jsonArray = [ { "user": { "id": 100, "screen_name": "d_linq" }, "text": "to objects" }, { "user": { "id": 130, "screen_name": "c_bill" }, "text": "g" }, { "user": { "id": 155, "screen_name": "b_mskk" }, "text": "kabushiki kaisha" }, { "user": { "id": 301, "screen_name": "a_xbox" }, "text": "halo reach" } ]; // ["b_mskk:kabushiki kaisha", "c_bill:g", "d_linq:to objects"] var queryResult = Enumerable.From(jsonArray) .Where(function (x) { return x.user.id < 200 }) .OrderBy(function (x) { return x.user.screen_name }) .Select(function (x) { return x.user.screen_name + ':' + x.text }) .ToArray();
์กฐ๊ธ ๋ ํธํ๊ฒ ๋๋ค ํจ์๋ฅผ ์ด์ฉํ๋ค๋ฉด ์๋์ ๊ฐ์ด ์ฌ์ฉํ ์๋ ์๋ค. ์์ ์๋๋ ๋์ผํ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ์ ธ์จ๋ค.
// shortcut! string lambda selector var queryResult2 = Enumerable.From(jsonArray) .Where("$.user.id < 200") .OrderBy("$.user.screen_name") .Select("$.user.screen_name + ':' + $.text") .ToArray();
๋ง์ฐฌ๊ฐ์ง๋ก jQuery ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํ๋ค๋ฉด ๋์ฑ ๊ฐ๊ฒฐํ ํํ์ ์ธ ์ ์๋ค.
// $.Enumerable: // ์๋ฟ ๋ฉ์์ง๋ก ์ง์๋ง ๋ณด์ฌ์ค๋ค. ์ด ๋ค์ฏ๋ฒ. $.Enumerable.Range(1, 10).Where("$%2==0").ForEach("alert($)"); // TojQuery - Enumerable to jQuery // #select1 ์ด๋ผ๊ณ ํ๋ ID๋ฅผ ๊ฐ์ง ๋๋กญ๋ค์ด๋ฆฌ์คํธ์ ์ต์ ์ 1๋ถํฐ 10๊น์ง ์ถ๊ฐํ๋ค. $.Enumerable.Range(1, 10) .Select(function (i) { return $("<option>").text(i)[0] }) .TojQuery() .appendTo("#select1"); // toEnumerable - jQuery to Enumerable // 1๋ถํฐ 10๊น์ง ์ถ๊ฐํ ๊ฐ์ ๋ชจ๋ ๋ํ๋ค. var sum = $("#select1").children() .toEnumerable() .Select("parseInt($.text())") .Sum(); // 55
์ด๋ ๊ฒ ์ฝ๊ฒ ์ฌ์ฉ์ด ๊ฐ๋ฅํ๋ค. ๋ ๋ง์ ๋ ํผ๋ฐ์ค๋ ์ด๊ณณ์์ ํ์ธํ ์ ์๋ค.
IE6 - 8 ์์ linq.js ์ฌ์ฉํ๊ธฐ โ es5-shim
๋ฌธ์ ๋ ์ญ์๋ IE6, IE7, IE8 ์์ ๋ฐ์ํ๋ค. ๊ทธ ์ด์ ๋ ๊ธฐ๋ณธ์ ์ธ ์๋ฐ์คํฌ๋ฆฝํธ ์ฒ๋ฆฌ ์์ง์ ๋ฒ์ ์ผ๋ก, EcmaScript 5 ๋ฅผ ์ง์ํ์ง ์๋ ๋ธ๋ผ์ฐ์ ์ด๊ธฐ ๋๋ฌธ์ด๋ค. ์ฆ, ๋ฐฐ์ด ์ฒ๋ฆฌ๊ฐ ์๋นํ ์ ํ์ ์ด๋ผ์ ์ด linq.js๊ฐ ์ ๋๋ก ๋์ํ์ง ์๋๋ค.
ํ์ง๋ง, ์ด๋ด ๋ es5-shim ์ด๋ผ๋ ์๋ฐ์คํฌ๋ฆฝํธ๋ฅผ ์ถ๊ฐํด ์ฃผ๋ฉด IE6-8 ์์๋ ์ด linq.js๋ฅผ ์ฌ์ฉํ ์ ์๋ค.
๋ง์ฝ html5shiv๋ฅผ ์ฌ์ฉํ๋ค๋ฉด, ๋ฐ๋ก ๋ฐ์ ์ด es5-shim ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ถ๊ฐํ๋๋ก ํ์. ์๋๋ผ๋ฉด modernizr ๋ฐ๋ก ๋ฐ์ ์ถ๊ฐํด๋ ๋๋ค.
<script src="/path/to/es5-shim.min.js"></script>
๋จ์ํ ์ด๋ ๊ฒ ์ถ๊ฐํ๋ ๊ฒ ๋ง์ผ๋ก linq.js์ ๊ธฐ๋ฅ๋ค์ ๋ชจ๋ ์ฌ์ฉํ ์ ์๊ฒ ๋๋ค.












