Want to protect your cyber security and still get fast solutions? Ask a secure question today.Go Premium

x
  • Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 741
  • Last Modified:

join linq to sql with an array

Ok just getting started with Linq and I've stumbled on an issue.

I've got a Linq query that is coming from a SQL DB that I have read only access to.

 
RapCourseRosters rd = new RapCourseRosters();
            var query =
                from classes in rd.Events_and_Classes 
                join courses in rd.Courses on classes.Course_ID equals courses.Course_ID
                where classes.End_Date.CompareTo(startyyyymmdd) >= 0
                && classes.End_Date.CompareTo(endyyyymmdd) <= 0
                && courses.Course_Type == "ACC"
                orderby classes.End_Date.ToString()
              select new { 
                  End_Date = classes.End_Date,
                  End_Date_Norm = classes.End_Date.Substring(4,2) + "/" + classes.End_Date.Substring(6,classes.End_Date.Length) + "/" + classes.End_Date.Substring(0,4),
                  Start_Date = classes.Start_Date, 
                  Event_Name = classes.Event_Name, 
                  Event_ID = classes.Event_ID,
                  Course_ID = courses.Course_ID
              };

Open in new window


I want to join this data to data on EventID to data  that I have in a separate .Csv file lets say:

csvEventID            |       csvLastAccessed
--------------------------------------------------------
CE-1212-880         |       2/24/2011
CE-1212-881         |       2/21/2011
CE-1212-887         |       2/24/2009
CE-1212-771         |       7/02/2010

I can do this via temporary recordsets but as a learning exercise I'm trying to do it in pure Linq. Is there an elegant way to join them using Linq?

Thanks

Michael




0
mcunn
Asked:
mcunn
  • 4
  • 3
2 Solutions
 
käµfm³d 👽Commented:
Hmmm...   Interesting. Should be a simple enough task, though  = )

Let's try this (Note: there is no error checking):
var joined = from line in System.IO.File.ReadAllLines("C:\\path\\to\\file.txt")
             let parts = line.Split(new char[] { ',' })[0]
             join rcr in rd
             on rcr.Event_ID equals parts[0]
             select new { End_Date = rcr.End_Date,
                          End_Date_Norm = rcr.End_Date_Norm,
                          Start_Date = rcr.Start_Date,
                          Event_Name = rcr.Event_Name,
                          Event_ID = rcr.Event_ID,
                          Course_ID = rcr.Course_ID,
                          Last_Accessed = parts[1]
             };

Open in new window

0
 
mcunnAuthor Commented:
Kaufmed,

Thanks for the code I'm trying to understand what you are doing in this block

 
join rcr in rd
on rcr.Event_ID equals parts[0]

Open in new window


Im getting an error on the join "RCR is not in scope on left side of  join"

Thanks

Michael

0
 
Fernando SotoRetiredCommented:
Hi mcunn;

Modifying Kaufmed solution, try it like this.

Fernando
var joined = from line in System.IO.File.ReadAllLines("C:\\path\\to\\file.txt")
             let parts = line.Split(new char[] { ',' })[0]
             join rcr in query
             on parts[0] equals rcr.Event_ID 
             select new { End_Date = rcr.End_Date,
                          End_Date_Norm = rcr.End_Date_Norm,
                          Start_Date = rcr.Start_Date,
                          Event_Name = rcr.Event_Name,
                          Event_ID = rcr.Event_ID,
                          Course_ID = rcr.Course_ID,
                          Last_Accessed = parts[1]
             };

Open in new window

0
Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
käµfm³d 👽Commented:
Thx FernandoSoto! I admit the code was untested  = )


As far as the intent: I took your requirement literally and read each line of the file into an (implicit) array. At that point, however, the text is still just a string, so it has to be split on the comma (since you said CSV). I'm holding the split in a temporary local (to the Linq query) variable called "parts". Given your description above, the first index of parts should be the "csvEventID"; the second index should be the "csvLastAccessed". The query is joining the Event_ID from "rd" to the "csvEventID" of the array (index 0).
0
 
mcunnAuthor Commented:
Thanks guys that's exactly what I was looking for.
0
 
käµfm³d 👽Commented:
NP. Glad to help  : )
0
 
käµfm³d 👽Commented:
Hmmm....  you've probably already accounted for this, but I can't see why I originally included the [0] at the end of the split. That, from what I can see, would set parts to the value of the first index of the array. Unless I'm missing something, remove the [0] from the end of the "let" line  : )
0
 
mcunnAuthor Commented:
Yep, I caught it... totally forgot to post the correction as I was so excited it actually worked.

Thanks again!

0

Featured Post

Get free NFR key for Veeam Availability Suite 9.5

Veeam is happy to provide a free NFR license (1 year, 2 sockets) to all certified IT Pros. The license allows for the non-production use of Veeam Availability Suite v9.5 in your home lab, without any feature limitations. It works for both VMware and Hyper-V environments

  • 4
  • 3
Tackle projects and never again get stuck behind a technical roadblock.
Join Now