PDA

View Full Version : سرچ پیشرفته + جوین کردن چند تیبل



mohsenelf
شنبه 03 اسفند 1392, 13:08 عصر
سلام و وقت بخیر ! :)

من چند تا تیبل مختلف دارم ، یکی برای ناشرین ، یکی برای یوزر ها ، یکی برای کتاب ها و ...
الان برای سرچ پیشرفته نیاز دارم با کمترین کوری زدن به دیتابیس ، اطلاعات رو به دست بیارم .

فیلدهای سرچ من اینها هستن:
نام کتاب ، نام نویسنده ، فامیلی نویسنده ، نام انتشارات

و نیازه که وقتی طرف به فرض اسم انتشارات رو وارد میکنه ، من اول یه کوری بزنم به تیبل ناشران و آی دی انتشارات رو بدست بیارم و بعد روی تیبل کتاب ها ، همه ی کتاب هایی که انتشاراتشون اون باشه رو لیست کنم و ....
دیتابیس اصلی بیش از 6هزار تا کتاب داره ، و ناشرین و نویسنده ها هم زیاد هستن ! میخواستم بهترین راه رو بدونم :)

ممنون از وقتی که میذارین :)


کدی که فعلا نوشتم اینه ولی اصلن خوب نیست :




BookDataContext book = new BookDataContext(Config._Connection);
PublisherDataContext pub = new PublisherDataContext(Config._Connection);


List<Book> lst_BookName = new List<Book>();
List<Book> lst_Publisher = new List<Book>();
List<Book> lst_FName = new List<Book>();
List<Book> lst_LName = new List<Book>();

List<Book> result = new List<Book>();




if (!string.IsNullOrEmpty(txt_search_BookName.Text))
{
var books_name = (from p in book.Books where SqlMethods.Like(p.Book_Name, "%" + txt_search_BookName.Text + "%") select p).ToList();
lst_BookName = books_name;
}

if (!string.IsNullOrEmpty(txt_search_Publisher.Text))
{
var books_publisher = (from p in book.Books join p2 in pub.publishers on p.Pub_ID equals p2.Pub_ID where SqlMethods.Like(p2.Publisher_Name, "%" + txt_search_Publisher.Text + "%") select p).ToList();
lst_Publisher = books_publisher;
}

if (!string.IsNullOrEmpty(txt_search_AuthorFirstName. Text))
{
var books_AuthorFirstName = (from p in book.Authors join p2 in book.Books on p.Authror_ID equals p2.Writers[0].Authror_ID where SqlMethods.Like(p.Authror_Name, "%" + txt_search_AuthorFirstName.Text + "%") select p2).ToList();
lst_FName = books_AuthorFirstName;
}

if (!string.IsNullOrEmpty(txt_search_AuthorLastName.T ext))
{
var books_AuthorLastName = (from p in book.Authors join p2 in book.Books on p.Authror_ID equals p2.Writers[0].Authror_ID where SqlMethods.Like(p.Authror_Family, "%" + txt_search_AuthorLastName.Text + "%") select p2).ToList();
lst_LName = books_AuthorLastName;
}


بعد از اینها هم یک سری if گذاشتم که این چند تا لیست رو اگه خالی نبودن ، با همدیگه مقایسه میکنه و یکی میکنه و توی گرید ویووو نشون میده :





if (lst_BookName.Any())
{
if (lst_Publisher.Any())
{
if (lst_FName.Any())
{
if (lst_LName.Any())
{
result = lst_Publisher.Union(lst_BookName).ToList();
result = result.Union(lst_FName).ToList();
result = result.Union(lst_LName).ToList();
}
else
{
result = lst_Publisher.Union(lst_BookName).ToList();
result = result.Union(lst_FName).ToList();
}
}
else
{
result = lst_Publisher.Union(lst_BookName).ToList();
}
}
else
if (lst_FName.Any())
{
if (lst_LName.Any())
{
result = lst_BookName.Union(lst_FName).ToList();
result = result.Union(lst_LName).ToList();
}
else
{
result = lst_BookName.Union(lst_FName).ToList();
}
}
else
if (lst_LName.Any())
{
result = lst_BookName.Union(lst_LName).ToList();
}
else
{
result = lst_BookName;
}
}
else
if (lst_Publisher.Any())
{
if (lst_FName.Any())
{
if (lst_LName.Any())
{
result = lst_Publisher.Union(lst_FName).ToList();
result = result.Union(lst_LName).ToList();
}
else
{
result = lst_Publisher.Union(lst_FName).ToList();
}
}
else
if (lst_LName.Any())
{
result = lst_Publisher.Union(lst_LName).ToList();
}
else
{
result = lst_Publisher;
}
}
else
if (lst_FName.Any())
{
if (lst_LName.Any())
{
result = lst_FName.Union(lst_LName).ToList();
}
else
{
result = lst_FName;
}
}
else
if (lst_LName.Any())
{
result = lst_LName;
}







myGridView.DataSource = result;
myGridView.DataBind();

mohsenelf
شنبه 03 اسفند 1392, 16:58 عصر
الان دارم از این کد استفاده میکنم ولی هنوز به اون دیتابیس اصلی وصل نکردم ، به نظرتون راهه بهتر و اوپتیمایز تری میرسه که استفاده کنم ؟ (عجب جمله بندی ای کردم !!! O.o)




protected void btn_AdvanceSearch_Click(object sender, EventArgs e)
{
BookDataContext book = new BookDataContext(Config._Connection);
PublisherDataContext pub = new PublisherDataContext(Config._Connection);


List<Book> lst_BookName = new List<Book>();
List<Book> lst_Publisher = new List<Book>();
List<Book> lst_FName = new List<Book>();
List<Book> lst_LName = new List<Book>();

List<Book> result = new List<Book>();


var bbb = (from p in book.Books select p).ToList();


if (!string.IsNullOrEmpty(txt_search_BookName.Text))
{
var books_name = (from p in book.Books where SqlMethods.Like(p.Book_Name, "%" + txt_search_BookName.Text + "%") select p).ToList();
lst_BookName = books_name;
}

if (!string.IsNullOrEmpty(txt_search_Publisher.Text))
{
var aaa = (from p in pub.publishers where SqlMethods.Like(p.Publisher_Name, "%" + txt_search_Publisher.Text + "%") select p).ToList();
var books_publisher = (from b in bbb join p in aaa on b.Pub_ID equals p.Pub_ID select b).ToList();
lst_Publisher = books_publisher;
}

if (!string.IsNullOrEmpty(txt_search_AuthorFirstName. Text))
{
var books_AuthorFirstName = (from p in book.Authors where SqlMethods.Like(p.Authror_Name, "%" + txt_search_AuthorFirstName.Text + "%") select p).ToList();
lst_FName = (from p in books_AuthorFirstName join p2 in bbb on p.Authror_ID equals p2.Writers[0].Authror_ID select p2).ToList();

}

if (!string.IsNullOrEmpty(txt_search_AuthorLastName.T ext))
{
var books_AuthorLastName = (from p in book.Authors where SqlMethods.Like(p.Authror_Family, "%" + txt_search_AuthorLastName.Text + "%") select p).ToList();
lst_LName = (from p in books_AuthorLastName join p2 in bbb on p.Authror_ID equals p2.Writers[0].Authror_ID select p2).ToList();
}






if (lst_BookName.Any())
{
if (lst_Publisher.Any())
{
if (lst_FName.Any())
{
if (lst_LName.Any())
{
result = lst_Publisher.Intersect(lst_BookName).ToList();
result = result.Intersect(lst_FName).ToList();
result = result.Intersect(lst_LName).ToList();

}
else
{
result = lst_Publisher.Intersect(lst_BookName).ToList();
result = result.Intersect(lst_FName).ToList();
}
}
else
{
result = lst_Publisher.Intersect(lst_BookName).ToList();
}
}
else
if (lst_FName.Any())
{
if (lst_LName.Any())
{
result = lst_BookName.Intersect(lst_FName).ToList();
result = result.Intersect(lst_LName).ToList();
}
else
{
result = lst_BookName.Intersect(lst_FName).ToList();
}
}
else
if (lst_LName.Any())
{
result = lst_BookName.Intersect(lst_LName).ToList();
}
else
{
result = lst_BookName;
}
}
else
if (lst_Publisher.Any())
{
if (lst_FName.Any())
{
if (lst_LName.Any())
{
result = lst_Publisher.Intersect(lst_FName).ToList();
result = result.Intersect(lst_LName).ToList();
}
else
{
result = lst_Publisher.Intersect(lst_FName).ToList();
}
}
else
if (lst_LName.Any())
{
result = lst_Publisher.Intersect(lst_LName).ToList();
}
else
{
result = lst_Publisher;
}
}
else
if (lst_FName.Any())
{
if (lst_LName.Any())
{
result = lst_FName.Intersect(lst_LName).ToList();
}
else
{
result = lst_FName;
}
}
else
if (lst_LName.Any())
{
result = lst_LName;
}







Rad_GridView.DataSource = result;
Rad_GridView.DataBind();

}

davodi
شنبه 03 اسفند 1392, 17:40 عصر
نه :تشویق: