Ankit Upadhyay
Ankit Upadhyay

Reputation: 53

First() taking time in linq

1) When i use without First() it's take 8ms sec

IEnumerable<string> Discriptionlist = (from lib in ProgramsData.Descendants("program")
                         where lib.Attribute("TMSId").Value == TMSIds 
                         select lib.Element("descriptions").Element("desc").Value);

2) With First() it's take 248ms sec

string Discriptionlist = (from lib in ProgramsData.Descendants("program")
                         where lib.Attribute("TMSId").Value == TMSIds 
                         select lib.Element("descriptions").Element("desc").Value).First();

Data reading use

using (var sr = new StreamReader(FilePath))
{
    Xdoc = XDocument.Load(sr);
}

Any solution or another way for reducing the time (It take less than 248ms ) and also get the result in a string.? Thank you.

Upvotes: 1

Views: 128

Answers (2)

Hogan
Hogan

Reputation: 70523

Linq uses a "feature" called lazy loading. What this means in practice is that in certain cases a linq expression will not actually do anything. It is just ready to do something when asked. So you have ask for an element it will then perform the action to get the next element at that time.

Since your first statement does not ask for an element the database is not even queried. In your second you ask for the First element the query has to run.

Upvotes: 1

Claudiu Guiman
Claudiu Guiman

Reputation: 877

The first statement just creates an IEnumerable, the actual query runs only when you start enumerating. The second statement runs the enumeration, that's why it's slower.

You'll notice the same thing with the same statement if you run this:

string DiscriptionListStr;
foreach(var a in Discriptionlist)
{
  DiscriptionListStr = a;
  break;
}

Upvotes: 3

Related Questions