문제
LINQ에 대해 뭔가 빠진 것 같습니다.나에게는 내가 가장 좋아하지 않는 SQL 요소 중 일부를 C# 언어로 옮겨서 다른 용도로 사용하는 것처럼 보입니다.
내 말은, 데이터베이스가 아닌 다른 것에 SQL과 유사한 문을 사용하면 이점이 있다는 것을 알 수 있다는 것입니다.하지만 SQL을 작성하고 싶다면 그냥 SQL을 작성하고 C#에서는 제외하면 어떨까요?내가 여기서 무엇을 놓치고 있는 걸까요?
해결책
LINQ는 SQL에 관한 것이 아닙니다.LINQ는 객체에 함수형 프로그래밍 패러다임을 적용하는 것입니다.
LINQ to SQL은 LINQ 기반 위에 구축된 ORM이지만 LINQ는 그 이상입니다.저는 LINQ to SQL을 사용하지 않지만 항상 LINQ를 사용합니다.
두 목록의 교차점을 찾는 작업을 수행해 보세요.
LINQ 이전에는 이 작업을 수행하려면 큰 목록 O(N*M)의 모든 항목에 대해 작은 목록을 한 번씩 반복하고 약 10줄의 코드를 사용하는 중첩된 foreach를 작성해야 했습니다.
foreach (int number in list1)
{
foreach (int number2 in list2)
{
if (number2 == number)
{
returnList.add(number2);
}
}
}
LINQ를 사용하면 한 줄의 코드로 동일한 작업을 수행합니다.
var results = list1.Intersect(list2);
LINQ처럼 보이지는 않지만 실제로는 그렇습니다.원하지 않는 경우 표현식 구문을 사용할 필요가 없습니다.
다른 팁
전에:
// Init Movie
m_ImageArray = new Image[K_NB_IMAGE];
Stream l_ImageStream = null;
Bitmap l_Bitmap = null;
// get a reference to the current assembly
Assembly l_Assembly = Assembly.GetExecutingAssembly();
// get a list of resource names from the manifest
string[] l_ResourceName = l_Assembly.GetManifestResourceNames();
foreach (string l_Str in l_ResourceName)
{
if (l_Str.EndsWith(".png"))
{
// attach to stream to the resource in the manifest
l_ImageStream = l_Assembly.GetManifestResourceStream(l_Str);
if (!(null == l_ImageStream))
{
// create a new bitmap from this stream and
// add it to the arraylist
l_Bitmap = Bitmap.FromStream(l_ImageStream) as Bitmap;
if (!(null == l_Bitmap))
{
int l_Index = Convert.ToInt32(l_Str.Substring(l_Str.Length - 6, 2));
l_Index -= 1;
if (l_Index < 0) l_Index = 0;
if (l_Index > K_NB_IMAGE) l_Index = K_NB_IMAGE;
m_ImageArray[l_Index] = l_Bitmap;
}
l_Bitmap = null;
l_ImageStream.Close();
l_ImageStream = null;
} // if
} // if
} // foreach
후에:
Assembly l_Assembly = Assembly.GetExecutingAssembly();
//Linq is the tops
m_ImageList = l_Assembly.GetManifestResourceNames()
.Where(a => a.EndsWith(".png"))
.OrderBy(b => b)
.Select(c => l_Assembly.GetManifestResourceStream(c))
.Where(d => d != null) //ImageStream not null
.Select(e => Bitmap.FromStream(e))
.Where(f => f != null) //Bitmap not null
.ToList();
또는 대안적으로(쿼리 구문):
Assembly l_Assembly = Assembly.GetExecutingAssembly();
//Linq is the tops
m_ImageList = (
from resource in l_Assembly.GetManifestResourceNames()
where resource.EndsWith(".png")
orderby resource
let imageStream = l_Assembly.GetManifestResourceStream(resource)
where imageStream != null
let bitmap = Bitmap.FromStream(imageStream)
where bitmap != null)
.ToList();
따라서 LINQ의 정말 중요한 점은 Linq to SQL과는 아무런 관련이 없습니다.C# 언어 자체에 가져온 향상된 기능에 관한 것입니다.
LINQ는 단순한 ORM 시스템이 아닙니다. Jonathan이 지적했듯이 LINQ는 C#에 많은 기능적 프로그래밍 요소를 제공합니다.그리고 일반 C# 코드에서 많은 "데이터베이스 수준" 작업을 수행할 수 있습니다.그것이 얼마나 믿을 수 없을 정도로 강력할 수 있는지 설명하기는 어렵습니다.일반 프레임워크에 포함된 견고하고 잘 설계된 일반 데이터 구조(예: 목록, 스택, 사전/해시 등)가 현대 언어의 개발 상태를 얼마나 개선했는지 생각해 보세요.이러한 데이터 구조를 사용하는 것은 매우 일반적이고 이를 사용하는 데 따른 지적 오버헤드를 줄이는 것이 큰 이점이기 때문입니다.LINQ는 사용자가 스스로 할 수 없는 작업을 수행하지 않지만 많은 작업을 훨씬 더 간단하고 쉽게 만듭니다.
순서가 지정되지 않은 목록에서 중복 항목을 제거하는 전통적인 예를 생각해 보세요.C 또는 C++와 같은 하위 수준 언어에서는 목록을 정렬하고 중복 항목을 제거할 때 목록에 두 개의 색인을 유지해야 할 수 있습니다.해시가 있는 언어(Java, C#, Javascript, Perl 등)에서는 키가 고유한 값인 해시를 만든 다음 키를 새 목록으로 추출할 수 있습니다.LINQ를 사용하면 다음과 같이 할 수 있습니다.
int[] data = { 0, 1, 3, 3, 7, 8, 0, 9, 2, 1 };
var uniqueData = data.GroupBy(i => i).Select(g => g.Key);
linq는 실제로 SQL 의류의 모나드이기 때문에 프로젝트에서 연속 모나드로 비동기 웹 요청을 만드는 데 사용하고 있는데 정말 잘 작동하는 것으로 입증되었습니다!
다음 기사를 확인하세요.http://www.aboutcode.net/2008/01/14/Async+WebRequest+Using+LINQ+Syntax.aspx http://blogs.msdn.com/wesdyer/archive/2008/01/11/the-marvels-of-monads.aspx
첫 번째 기사에서:
var requests = new[]
{
WebRequest.Create("http://www.google.com/"),
WebRequest.Create("http://www.yahoo.com/"),
WebRequest.Create("http://channel9.msdn.com/")
};
var pages = from request in requests
select
from response in request.GetResponseAsync()
let stream = response.GetResponseStream()
from html in stream.ReadToEndAsync()
select new { html, response };
foreach (var page in pages)
{
page(d =>
{
Console.WriteLine(d.response.ResponseUri.ToString());
Console.WriteLine(d.html.Substring(0, 40));
Console.WriteLine();
});
}
요점은 LINQ가 쿼리를 기본 프로그래밍 언어에 통합하여 IDE가 다른 경우에는 제공하지 못했던 일부 기능(예: Intellisense 및 디버그 지원)을 제공하고 컴파일러가 SQL 형식을 확인할 수 있도록 한다는 것입니다. 코드(일반 문자열 쿼리로는 불가능)