LINQ���g�p���ĕ����̔�r������AND��������ۂɁA�Ǝ���Where���\�b�h���쐬���邱�ƂŃR�[�h�̉ǐ������߂���@���������B
�@
�ΏہF.NET 3.5�ȍ~
�@������̃R���N�V������LINQ���g���Ď��X�ƌ�������Ƃ��ɁA��r�������ꍇ�����������Ƃ�������B�Ⴆ�A�����́uLIKE�����v��AND�Ō����������Ƃ��Ȃǂ��B���̂܂܃R�[�h�������������Ή\�Ȃ̂����A�R�[�h�̉ǐ����グ�悤�Ƃ��Ď��s���邱�Ƃ�����B�{�e�ł́A���s�������Љ�A���̑�Ƃ��āuWhere���\�b�h�v��Ǝ��ɍ쐬���Ďg�����@���������B
�@���炩���߂��f�肵�Ă������AAND�^OR�₩���������荬�������{���ɕ��G�ȏ����̏ꍇ�ɂ́A�����_��*1�I�ɑg�ݗ��ĂĎ��c���[�����邱�ƂɂȂ�B���̂悤�ȕ��G�Ȍ��������ł́A�\����͂��K�{�ł��낤�B�\����͂��s���Ȃ�A���̂��łɎ��c���[������̂͂���قǍ���Ȃ��Ƃł͂Ȃ��B���c���[��������@�́A�u.NET TIPS�FLINQ���œ��I��Where���g�ݗ��Ă�ɂ́H�m3.5�AC#�AVB�n�v���Q�Ƃ��Ăق����B
�@�{�e�ł́AAND�����̏��������l����B�����@�\����������Ƃ��ɁA�ŋ��ꂽ����S��AND�����Ƃ��Ĉ����悤�ȊȈՓI�Ȍ������@��z�肵�Ă���B
�@�{�e�ł́AWhere���\�b�h�iSystem.Linq���O��Ԃ�Enumerable�N���X�ɒ�`���ꂽ�g�����\�b�h�j�����ۂǂ̂悤�ɓ��삷��̂����m�F�������B����������邽�߂ɁA��r���e���R���\�[���ɏo�͂��镶�����r���\�b�h���O�p�ӂ��Ă����i���̃R�[�h�j�BString�N���X�̕������r���\�b�h�Ɠ��l�ɋ@�\����̂����A�R���\�[���ɏo�͂���_���قȂ��Ă���B
using System;
public static class StringExtension
{
// String�N���X��Contains���\�b�h�Ɠ��������A�������e���R���\�[���ɏ����o��
public static bool ContainsEx(this string s, string key)
{
var result = s.Contains(key);
Console.WriteLine("\"{0}\".Contains(\"{1}\") {2}", s, key, result ? "��" : "�~");
return result;
}
// String�N���X��StartsWith���\�b�h�Ɠ��������A�������e���R���\�[���ɏ����o��
public static bool StartsWithEx(this string s, string key)
{
var result = s.StartsWith(key);
Console.WriteLine("\"{0}\".StartsWith(\"{1}\") {2}", s, key, result ? "��" : "�~");
return result;
}
// String�N���X��EndsWith���\�b�h�Ɠ��������A�������e���R���\�[���ɏ����o��
public static bool EndsWithEx(this string s, string key)
{
var result = s.EndsWith(key);
Console.WriteLine("\"{0}\".EndsWith(\"{1}\") {2}", s, key, result ? "��" : "�~");
return result;
}
}
Imports System.Runtime.CompilerServices
Module StringExtension
' String�N���X��Contains���\�b�h�Ɠ��������A�������e���R���\�[���ɏ����o��
<Extension()> _
Public Function ContainsEx(ByVal s As String, ByVal key As String) As Boolean
Dim result = s.Contains(key)
Console.WriteLine("""{0}"".Contains(""{1}"") {2}", s, key, If(result, "��", "�~"))
Return result
End Function
' String�N���X��StartsWith���\�b�h�Ɠ��������A�������e���R���\�[���ɏ����o��
<Extension()> _
Public Function StartsWithEx(ByVal s As String, ByVal key As String) As Boolean
Dim result = s.StartsWith(key)
Console.WriteLine("""{0}"".StartsWith(""{1}"") {2}", s, key, If(result, "��", "�~"))
Return result
End Function
' String�N���X��EndsWith���\�b�h�Ɠ��������A�������e���R���\�[���ɏ����o��
<Extension()> _
Public Function EndsWithEx(ByVal s As String, ByVal key As String) As Boolean
Dim result = s.EndsWith(key)
Console.WriteLine("""{0}"".EndsWith(""{1}"") {2}", s, key, If(result, "��", "�~"))
Return result
End Function
End Module
�@SQL��LIKE���Z�q�̂悤�ȕ�������LINQ�Ŏ�������ɂ́A�u.NET TIPS�FLINQ�F������R���N�V�����ŁuLIKE�����v�i������v�����j������ɂ́H�mC#�AVB�n�v�ŏq�ׂ��悤�ɁA������Ɋ܂܂�Ă���u%�v�̈ʒu�ɂ���ĕ������r�̏��������g��������B�܂��AAND�����́u.NET TIPS�FLINQ�F������R���N�V�����ŕ����L�[���[�h��AND����������ɂ́H�mC#�AVB�n�v�Ő��������悤�ɁAWhere���\�b�h�����X�Ƀ`�F�[������悢�B
�@�����Ȃ�ėp�I�ȃR�[�h�������͓̂���̂ŁA�܂��͌�������Œ肵�āA����̃P�[�X�����ɑΉ��ł���R�[�h�������Ă݂悤�B���̃R�[�h�̂悤�ɁuLIKE�����v��AND��\���ł���B
using System;
using System.Collections.Generic;
using System.Linq;
class Program
{
// �R���\�[���o�͗p�̃��\�b�h
static void WriteItems(string header, IEnumerable<string> items)
{
var output = string.Join(", ", items.ToArray());
Console.WriteLine("{0}: {1}", header, output);
}
static void Main(string[] args)
{
// �T���v���f�[�^�i������̔z��j
IEnumerable<string> sampleData = new string[] { "�Ԃ�", "���Ԃ�", "�Ԃ��܂�", "�˂Ԃ��܂�",
"�˂Ղ��܂�", "����", "�˂�", };
WriteItems("sampleData", sampleData);
// LIKE '��%' AND LIKE '%��' AND LIKE '%�Ԃ�%' �̂悤�Ȍ�����������
// �n�[�h�R�[�f�B���O���Ă݂�
Console.WriteLine();
Console.WriteLine("����P�[�X���n�[�h�R�[�f�B���O");
var case1 = sampleData.Where(item => item.StartsWithEx("��"))
.Where(item => item.EndsWithEx("��"))
.Where(item => item.ContainsEx("�Ԃ�"));
WriteItems("Where���\�b�h�����n�[�h�R�[�f�B���O", case1);
// �� Where���\�b�h�����n�[�h�R�[�f�B���O: �˂Ԃ��܂�
#if DEBUG
Console.ReadKey();
#endif
}
}
Module Module1
' �R���\�[���o�͗p�̃��\�b�h
Sub WriteItems(ByVal header As String, ByVal items As IEnumerable(Of String))
Dim output = String.Join(", ", items.ToArray())
Console.WriteLine("{0}: {1}", header, output)
End Sub
Sub Main()
' �T���v���f�[�^�i������̔z��j
Dim sampleData As IEnumerable(Of String) _
= New String() {"�Ԃ�", "���Ԃ�", "�Ԃ��܂�", "�˂Ԃ��܂�", _
"�˂Ղ��܂�", "����", "�˂�"}
WriteItems("sampleData", sampleData)
' LIKE '��%' AND LIKE '%��' AND LIKE '%�Ԃ�%' �̂悤�Ȍ�����������
' �n�[�h�R�[�f�B���O���Ă݂�
Console.WriteLine()
Console.WriteLine("����P�[�X���n�[�h�R�[�f�B���O")
Dim case1 = sampleData.Where(Function(item) item.StartsWithEx("��")) _
.Where(Function(item) item.EndsWithEx("��")) _
.Where(Function(item) item.ContainsEx("�Ԃ�"))
WriteItems("Where���\�b�h�����n�[�h�R�[�f�B���O", case1)
' �� Where���\�b�h�����n�[�h�R�[�f�B���O: �˂Ԃ��܂�
#If DEBUG Then
Console.ReadKey()
#End If
End Sub
End Module
�@���̃R�[�h�̎��s���ʂ́A���̉摜�̂悤�ɂȂ�B
�@���̃R�[�h�ł́A�^���錟����́u%�v�̈ʒu��ς������Ƃ��ɑΉ��ł��Ȃ��i�ǂ̌�����łǂ̕������r���\�b�h���g���������ߑł��ɂȂ��Ă���j�B�܂��A�^���錟����̐����Œ肳��Ă���B�����ėp�I�ȃR�[�h�ɏ������������̂��B
�@��̃R�[�h��ėp�����Ă݂悤�B������̐����ύX�ł���悤�Ƀ��[�v�ɂ���B������́u%�v�̈ʒu�ɂ���ė��p���镶�����r���\�b�h��蕪����̂́A���[�v�̒��ōs�����B����ƁA���̃R�[�h�̂悤�ɏ�����B
string[] keywords = { "��%", "%��", "%�Ԃ�%", }; // ������i�u%�v�t���j
Console.WriteLine();
Console.WriteLine("Where���\�b�h�����ǂ����邩���[�v���Ŕ���");
var case2 = sampleData;
foreach (var keyword in keywords)
{
var k = keyword.Trim("%".ToCharArray());
if (keyword.StartsWith("%") && keyword.EndsWith("%"))
{
Console.WriteLine("�L�[���[�h'{0}'�ɂ�ContainsEx���g��", keyword); // ��
case2 = case2.Where(item => item.ContainsEx(k));
}
else if (keyword.StartsWith("%"))
{
Console.WriteLine("�L�[���[�h'{0}'�ɂ�EndsWithEx���g��", keyword); // ��
case2 = case2.Where(item => item.EndsWithEx(k));
}
else if (keyword.EndsWith("%"))
{
Console.WriteLine("�L�[���[�h'{0}'�ɂ�StartsWithEx���g��", keyword); // ��
case2 = case2.Where(item => item.StartsWithEx(k));
}
else
{
Console.WriteLine("�L�[���[�h'{0}'�ɂ�Equals���g��", keyword); // ��
case2 = case2.Where(item => item.Equals(k));
}
}
WriteItems("Where���\�b�h�����ǂ����邩���[�v���Ŕ���", case2); // ��
// �� Where���\�b�h�����ǂ����邩���[�v���Ŕ���: �˂Ԃ��܂�
Dim keywords = New String() {"��%", "%��", "%�Ԃ�%"} ' ������i�u%�v�t���j
Console.WriteLine()
Console.WriteLine("Where���\�b�h�����ǂ����邩���[�v���Ŕ���")
Dim case2 = sampleData
For Each keyword In keywords
Dim k = keyword.Trim("%".ToCharArray())
If (keyword.StartsWith("%") AndAlso keyword.EndsWith("%")) Then
Console.WriteLine("�L�[���[�h'{0}'�ɂ�ContainsEx���g��", keyword) ' ��
case2 = case2.Where(Function(item) item.ContainsEx(k))
ElseIf (keyword.StartsWith("%")) Then
Console.WriteLine("�L�[���[�h'{0}'�ɂ�EndsWithEx���g��", keyword) ' ��
case2 = case2.Where(Function(item) item.EndsWithEx(k))
ElseIf (keyword.EndsWith("%")) Then
Console.WriteLine("�L�[���[�h'{0}'�ɂ�StartsWithEx���g��", keyword) ' ��
case2 = case2.Where(Function(item) item.StartsWithEx(k))
Else
Console.WriteLine("�L�[���[�h'{0}'�ɂ�Equals���g��", keyword) ' ��
case2 = case2.Where(Function(item) item.Equals(k))
End If
Next
WriteItems("Where���\�b�h�����ǂ����邩���[�v���Ŕ���", case2)
' �� Where���\�b�h�����ǂ����邩���[�v���Ŕ���: �˂Ԃ��܂�
�@���̎��s���ʂ͎��̉摜�̂悤�ɂȂ�B
�@�ėp�I�ȃR�[�h�ɂł������̂́A���̂܂܂ł͉ǐ��ɓ����B�����ƃX�}�[�g�ȃR�[�h�ɂ������̂��B
�@��̃R�[�h�̉ǐ����グ��ɂ́AWhere���\�b�h�ɗ^����������莮��ėp�I�Ȃ��̂ɂ���悢�A�Ƃ������z�����蓾��B�ėp�I�ȏ������胁�\�b�h�����A���[�v����if�����Ȃ�����̂ł���B����Ă݂悤�B
�@�܂��A�������胁�\�b�h�uLikeEx�v���A�`���Ɏ�����ContainsEx���\�b�h�Ȃǂ�StringExtension�N���X�̒��Ɋg�����\�b�h�Ƃ��č쐬����i���̃R�[�h�j�B
public static class StringExtension
{
// �c�c�����R�[�h�ȗ��c�c
// LIKE������s�����\�b�h
public static bool LikeEx(this string item, string keyword)
{
var k = keyword.Trim("%".ToCharArray());
if (keyword.StartsWith("%") && keyword.EndsWith("%"))
{
Console.WriteLine("�L�[���[�h'{0}'�ɂ�ContainsEx���g��", keyword); // ��
return item.ContainsEx(k);
}
else if (keyword.StartsWith("%"))
{
Console.WriteLine("�L�[���[�h'{0}'�ɂ�EndsWithEx���g��", keyword); // ��
return item.EndsWithEx(k);
}
else if (keyword.EndsWith("%"))
{
Console.WriteLine("�L�[���[�h'{0}'�ɂ�StartsWithEx���g��", keyword); // ��
return item.StartsWithEx(k);
}
else
{
Console.WriteLine("�L�[���[�h'{0}'�ɂ�Equals���g��", keyword); // ��
return item.Equals(k);
}
}
}
Imports System.Runtime.CompilerServices
Module StringExtension
' �c�c�����R�[�h�ȗ��c�c
' LIKE������s�����\�b�h
<Extension()> _
Public Function LikeEx(ByVal item As String, ByVal keyword As String) As Boolean
Dim k = keyword.Trim("%".ToCharArray())
If (keyword.StartsWith("%") AndAlso keyword.EndsWith("%")) Then
Console.WriteLine("�L�[���[�h'{0}'�ɂ�ContainsEx���g��", keyword) ' ��
Return item.ContainsEx(k)
ElseIf (keyword.StartsWith("%")) Then
Console.WriteLine("�L�[���[�h'{0}'�ɂ�EndsWithEx���g��", keyword) ' ��
Return item.EndsWithEx(k)
ElseIf (keyword.EndsWith("%")) Then
Console.WriteLine("�L�[���[�h'{0}'�ɂ�StartsWithEx���g��", keyword) ' ��
Return item.StartsWithEx(k)
Else
Console.WriteLine("�L�[���[�h'{0}'�ɂ�Equals���g��", keyword) ' ��
Return item.Equals(k)
End If
End Function
End Module
�@����ƁALINQ�Ō��������s���镔���̃R�[�h�́A���̂悤�ɃV���v���ɏ�����B
Console.WriteLine();
Console.WriteLine("Where���\�b�h�̃����_�����uLikeEx�v���\�b�h�œ���");
var case3 = sampleData;
foreach (var keyword in keywords)
{
var k = keyword; // VS2012�ȍ~�ł́A���̕ϐ��ւ̑���͕s�v
case3 = case3.Where(item => item.LikeEx(k));
}
WriteItems("Where���\�b�h�̃����_�����uLikeEx�v���\�b�h�œ���", case3);
// �� Where���\�b�h�̃����_�����uLikeEx�v���\�b�h�œ���: �˂Ԃ��܂�
Console.WriteLine()
Console.WriteLine("Where���\�b�h�̃����_�����uLikeEx�v���\�b�h�œ���")
Dim case3 = sampleData
For Each keyword In keywords
Dim k = keyword ' VS2012�ȍ~�ł́A���̕ϐ��ւ̑���͕s�v
case3 = case3.Where(Function(item) item.LikeEx(k))
Next
WriteItems("Where���\�b�h�̃����_�����uLikeEx�v���\�b�h�œ���", case3)
' �� Where���\�b�h�̃����_�����uLikeEx�v���\�b�h�œ���: �˂Ԃ��܂�
�@���C���̃R�[�h���Z���Ȃ�A�ǐ��͏オ�����B�Ƃ��낪�A��������s����Ǝ��̉摜�̂悤�Ȍ��ʂɂȂ��Ă��܂��B
�@�uLIKE�v���胁�\�b�h�������@�́A�������悭�Ȃ��ƕ��������B�Ȃ������Ȃ����̂��낤���H Where���\�b�h�̈����ɗ^���郉���_���́A�R���N�V�����̗v�f���ƂɌĂяo����邱�Ƃ��v���o���Ăق����B���̌Ăяo���̒��ɔ��菈�����L�q���Ă��܂����̂�����A�v�f���ƂɎ��s����Ă��܂����̂ł���i�����āA3�[�v���Ă���̂ŁA�v�f���Ƃɍő�3��܂ŌJ��Ԃ��Ăяo����邱�ƂɂȂ�j�B
�@��̎��s�������ɂ͂ǂ�������悢���낤���H Where���\�b�h�̈����ɗ^���郉���_���̒��ɔ��菈�����L�q�ł��Ȃ��Ƃ�����A�ǂ��ɏ����悢�̂��H �Ǝ��́uWhere���\�b�h�v������āA�����Ŕ��菈�����s���悢�̂ł���B
�@�Ǝ��́uWhere���\�b�h�v�Ƃ��āuWhereLike�v�Ƃ������O�̃��\�b�h�����i���̃R�[�h�j�BLINQ�̃`�F�[���Ŏg�������̂ŁAIEnumerable<string>�C���^�[�t�F�[�X�iC#�j�^IEnumerable(Of String)�C���^�[�t�F�[�X�iVB�j��Ԃ��g�����\�b�h�Ƃ��Ď�������B���́uWhereLike�v���\�b�h�̒��g�́A�O�q�����f���Ƀ��[�v�������R�[�h��̃��[�v�����o�����`�ɂȂ�B
using System;
using System.Collections.Generic;
using System.Linq;
public static class LinqExtension
{
public static IEnumerable<string> WhereLike(
this IEnumerable<string> items, string keyword)
{
var k = keyword.Trim("%".ToCharArray());
if (keyword.StartsWith("%") && keyword.EndsWith("%"))
{
Console.WriteLine("�L�[���[�h'{0}'�ɂ�ContainsEx���g��", keyword); // ��
return items.Where(item => item.ContainsEx(k));
}
else if (keyword.StartsWith("%"))
{
Console.WriteLine("�L�[���[�h'{0}'�ɂ�EndsWithEx���g��", keyword); // ��
return items.Where(item => item.EndsWithEx(k));
}
else if (keyword.EndsWith("%"))
{
Console.WriteLine("�L�[���[�h'{0}'�ɂ�StartsWithEx���g��", keyword); // ��
return items.Where(item => item.StartsWithEx(k));
}
else
{
Console.WriteLine("�L�[���[�h'{0}'�ɂ�Equals���g��", keyword); // ��
return items.Where(item => item.Equals(k));
}
}
}
Imports System.Runtime.CompilerServices
Module LinqExtension
<Extension()> _
Public Function WhereLike(ByVal items As IEnumerable(Of String), _
ByVal keyword As String) As IEnumerable(Of String)
Dim k = keyword.Trim("%".ToCharArray())
If (keyword.StartsWith("%") AndAlso keyword.EndsWith("%")) Then
Console.WriteLine("�L�[���[�h'{0}'�ɂ�ContainsEx���g��", keyword) ' ��
Return items.Where(Function(item) item.ContainsEx(k))
ElseIf (keyword.StartsWith("%")) Then
Console.WriteLine("�L�[���[�h'{0}'�ɂ�EndsWithEx���g��", keyword) ' ��
Return items.Where(Function(item) item.EndsWithEx(k))
ElseIf (keyword.EndsWith("%")) Then
Console.WriteLine("�L�[���[�h'{0}'�ɂ�StartsWithEx���g��", keyword) ' ��
Return items.Where(Function(item) item.StartsWithEx(k))
Else
Console.WriteLine("�L�[���[�h'{0}'�ɂ�Equals���g��", keyword) ' ��
Return items.Where(Function(item) item.Equals(k))
End If
End Function
End Module
�@������g���ƁALINQ�Ō��������s���镔���͎��̃R�[�h�̂悤�ɂȂ�B
Console.WriteLine();
Console.WriteLine("�Ǝ��́uWhere���\�b�h�v�����");
var case4 = sampleData;
foreach (var keyword in keywords)
{
case4 = case4.WhereLike(keyword);
}
WriteItems("�Ǝ��́uWhere���\�b�h�v�����", case4);
// �� �Ǝ��́uWhere���\�b�h�v�����: �˂Ԃ��܂�
Console.WriteLine()
Console.WriteLine("�Ǝ��́uWhere���\�b�h�v�����")
Dim case4 = sampleData
For Each keyword In keywords
case4 = case4.WhereLike(keyword)
Next
WriteItems("�Ǝ��́uWhere���\�b�h�v�����", case4)
' �� �Ǝ��́uWhere���\�b�h�v�����: �˂Ԃ��܂�
�@���̎��s���ʂ�����ƁA���ʂȔ��菈���͍s���Ă��Ȃ��i���̉摜�j�B
�@���̂悤�ɓƎ��́uWhere���\�b�h�v����邱�ƂŁA�����𗎂Ƃ����ɃR�[�h�̉ǐ������P�ł����B
�@LINQ�̈����ɗ^���郉���_���̒��ŃR���N�V�����̗v�f�ȊO�̂��́i�{�e�̗�ł͌�����j��ΏۂƂ��鏈�����s���̂͌����������B���̂悤�ȂƂ��ɂ́A�Ǝ��́uWhere���\�b�h�v�̍쐬���������悤�i�{�e�̗�͂��ꂪ���܂��s�����ꍇ�ł���j�B
�@LINQ�̃`�F�[���Ŏg����Ǝ��́uWhere���\�b�h�v�i���邢�́A���̑��D���ȏ������s�����\�b�h�j�́A�V�O�l�`���i�g�����\�b�h�ŁA�ŏ��̈����ƕԒl��IEnumerable<T>�^IEnumerable(Of T)�C���^�[�t�F�[�X�ł��邱�Ɓj�ɋC��t����A���̂͂���قǓ���Ȃ��B
*1�@Where�g�����\�b�h�̈����ɂ́A�����_����^����B�����_���ɂ��ďڂ����́A����MSDN�̃h�L�������g���Q�Ƃ��Ă������������B
*2�@���̋@�\�́u�N�G���̒x���]���i�܂��͒x�����s�j�v�ƌĂ��B�ڂ�����MSDN�Ɍf�ڂ���Ă���uLINQ: .NET ��������N�G���v�iDon Box�AAnders Hejlsberg���j�́uLINQ �v���W�F�N�g���T�|�[�g���錾��@�\�v�̍����A�u�N�G���̒x���]���v�̍����Q�Ƃ��Ă������������B
���p�\�o�[�W�����F.NET Framework 3.5�ȍ~
�J�e�S���F�N���X���C�u�����@�����ΏہFLINQ
�g�p���C�u�����FEnumerable�N���X�iSystem.Linq���O��ԁj
�g�p���C�u�����FString�N���X�iSystem���O��ԁj
�֘ATIPS�FLINQ�F������R���N�V�����ŁuLIKE�����v�i������v�����j������ɂ́H�mC#�AVB�n
�֘ATIPS�FLINQ�F������R���N�V�����ŕ����L�[���[�h��AND����������ɂ́H�mC#�AVB�n
�u.NET TIPS�v
Copyright© Digital Advantage Corp. All Rights Reserved.