简体   繁体   中英

How to make a join table search with Entity Framework?

So I made a windows form which has a search textbox that will return the parts of string that you have entered in the datagrid. However, in my attempt to code this following event. The datagrid shows boolean instead.

Which parts of the code is making all these result turns boolean and how can i fix this?

private void txtSearch_TextChanged(object sender, EventArgs e)
    {
        this.dataGridView1.DataSource = null;
        this.dataGridView1.Rows.Clear();

        using (var context = new edeappEntities1())
        {
            var data = context.bookingorders
             .Join(
             context.addressbooks,
             booking => booking.addrID,
             address => address.addrID,
             (booking, address) => new
             {
                 accID = booking.accID.Contains(txtSearch.Text),
                 bookId = booking.bookingID.Contains(txtSearch.Text),

                 companyName = address.companyName.Contains(txtSearch.Text),

                 address = address.addressLn1.Contains(txtSearch.Text) || address.addressLn2.Contains(txtSearch.Text) ||
                 address.addressLn3.Contains(txtSearch.Text),

                 region = address.region.Contains(txtSearch.Text),
                 postcode = address.postcode.Contains(txtSearch.Text),
                 contact = address.contectName.Contains(txtSearch.Text),
                 phone = address.phoneNo.Contains(txtSearch.Text),
                 fax = address.faxNo.Contains(txtSearch.Text),
                 telex = address.telexNo.Contains(txtSearch.Text),

                 pickupTime = booking.pickupDate.Contains(txtSearch.Text)
                 || booking.pickupTime.Contains(txtSearch.Text)
             }
             ).ToList();

            foreach (var db in data)
            {
                dataGridView1.Rows.Add(db.accID, db.bookId, db.companyName, db.address, db.region,
                     db.postcode, db.contact, db.phone, db.fax, db.telex, db.pickupTime);
            }
        }
    }

My modelling structure: model1.edmx

Search result is boolean: link

You are getting a Boolean result in all the columns because you are creating a new anonymous type and assigning the result of string.Contains() method to each property in that new anonymous type and string.Contains() returns a Boolean( bool ).

For example, if I do this:

string str = "Hello!"
bool result = str.Contains("o");

Here, the Contains() method will return a Boolean value indicating whether the string contains the specified substring("o") in it. The return value here will be true which will be assigned to result .

In your code, you do something similar for each field:

accID = booking.accID.Contains(txtSearch.Text)

This will check if booking.accID contains the string searched by the user which is captured in txtSearch.Text . If your booking.accID contains txtSearch.Text , the method will return true and false if it does not contain the search text. This will create a new variable of type bool called accId and the return value will be stored in accId on the left-hand side of = .


Anonymous Types

In C#, an anonymous type is a quick way to create a wrapper object containing a set of properties without actually creating a class.

For instance, I want an object containing details about a person without creating a Person class, I can do this:

var myPerson = new { Name = "John", Age = 25, Salary = 10_000L };

Now, I have an object containing the properties Name , Age and Salary without even creating a Person class. The compiler creates a hidden class in the background. More on anonymous types here .

You are creating a lambda function that returns an anonymous type as the fourth parameter of the Join() method. This lambda function will be called on each result of the join operation.


Solution

The filtering condition should be specified in a Where() method instead of assigning it to properties in the anonymous type. The anonymous type should be used to capture and combine the two results:

var searchData = context
.bookingorders
.Join(
    context.addressbooks,
    booking => booking.addrID,
    address => address.addrID,
    (booking, address) => new
    {
        Booking = booking,
        Address = address
    })
.Where(data => 
    data.Booking.bookingID.Contains(txtSearch.Text) ||  
    data.Address.companyName.Contains(txtSearch.Text) ||
    data.Address.addressLn1.Contains(txtSearch.Text) || 
    data.Address.addressLn2.Contains(txtSearch.Text) ||
    data.Address.region.Contains(txtSearch.Text) ||
    data.Address.postcode.Contains(txtSearch.Text) ||
    data.Address.contectName.Contains(txtSearch.Text) ||
    data.Address.phoneNo.Contains(txtSearch.Text) ||
    data.Address.faxNo.Contains(txtSearch.Text) ||
    data.Address.telexNo.Contains(txtSearch.Text) ||
    data.Booking.pickupDate.Contains(txtSearch.Text) || 
    data.Booking.pickupTime.Contains(txtSearch.Text)
)
.ToList();

foreach(var row in searchData)
{
    dataGridView1.Rows.Add(
        row.Booking.bookingId, 
        row.Address.companyName,
        $"{row.Address.addressLn1} {row.Address.addressLn2}", 
        row.Address.region, 
        row.Address.postcode,
        row.Address.contectName,
        row.Address.phoneNo,
        row.Address.faxNo,
        row.Address.telexNo,
        row.Booking.pickupDate,
        row.Booking.pickupTime
    );
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM