All posts by Julie

Onward and downward

In keeping with the theme of the last few posts (about eSqlBlast written by Zlatko Michailov), Zlatko has just broken his news (a big surprise to me and I am definitely bummed) that he has “decided to take on new challenges unrelated to EDM and Entity Framework. Starting [yesterday] [he]’ll be working on the lower levels of the SQL Server Connectivity stack.

He has promised me that there are others on the team who know EntitySQL as well as he does (it’s hard to imagine).

So he’s going further down into the plumbing and I’m sure this will still benefit all of us who use SQL SErver in our apps.

But still…. :-(.

eSqlBlast tip

I meant to mention this in my last blog post (An excerpt from my book about eSqlBlast) which is that with the new Entity Framework bits, the schema files that are generated when you build your EDM project are embedded into the assembly by default. Yet eSqlBlast depends on files that are accesible via the file directory.

What I’ve been doing is temporarily changing the MetaData Artifact Processing property of the model to Copy to Output Directory, building the project, then copying the newly created files (csdl, msl and ssdl) to a separate folder. Then I can point eSqlBlast to those files and set the model back to Embed in Output Assembly so that the other projects depending on the model can access the schema files.

An excerpt from my book about eSqlBlast

eSqlBlast – Entity SQL Query Helper
I could not have figured out some of these more complex Entity SQL queries without the help of a tool called eSqlBlast written by Zlatko Michailov (in his free time) who is the Program Manager for Entity SQL. The tool is available on Code Gallery along with a number of other tools for Entity Framework at http://code.msdn.com/adonetefx. With eSqlBlast, you can test queries and receive immediate feedback, whether it is an error message describing a problem with the query, or the results along with the generated SQL for the database. I have used the tool in its early stages and look forward to seeing it evolve.

Days and Days with QueryViews

I have been learning a lot about EDM QueryViews lately, though more of what I’m learning (the hard way) is what you can’t do with QueryViews.

Most of what you’ll find documented about QueryViews is to replace mappings so that your resulting entity is read only. But there are more uses for QueryViews. THe problem is that I"m having a very hard time discovering what those are and therefore it’s trial and error (and some help from Srikanth on the EF team who seemed to get stuck with Holiday Weekend forum duty).

It started with an old hope of mine to be able to embed a FullName property directly into the model. I thought I could do this with QueryViews by adding a new property to the Entity called FullName and then using EntitySQL string concatenation syntax to combine Trim(LastName) + ", " + FirstName or at the least Concat(LastName, ",", FirstName).

After working out the various validation errors and then weeding out what causes them (Trim, Contact and +) I have come to the conclusion that you just can’t use any functions at all. I could be wrong, but so far that’s where I’m at.

In fact it took me a while to realize that this error

The query view specified for ‘Contacts’ EntitySet’s type(s) ‘IsTypeOf(BAModel.Contact)’ contains an unsupported expression of kind ‘Function’.

 

might not be telling me that the Trim function wasn’t supported but that no Functions are supported. I still can’t tell, but expect to get some confirmation one way or another (and it *is* a holiday weekend in the U.S. so I’ll be patient).

 

I’m still waiting for confirmation of my conclusion, but after going around in circles for days, I wonder if I’ve finally hit the nail on the head.

 

I also sent an email to the doc team to please include more details about writing QueryViews.

 

QueryView does support a bunch (but not all ) of the Entity SQL operators. You can do things like write CASE statements, perform UNIONS, test for ISNULL. So you can write some logic into them.

 

It also supports operators that can’t be used in Conditional Mapping. WIth Conditional Mapping you can only test for = or IS NULL or IS NOT NULL. By using a QueryView you can add int greater than and less than, BUT  – on what?

 

I thought – ah okay, I’ll try a condition on a date field.

SELECT VALUE BAModel.Contact(c.ContactID,c.FirstName,c.LastName,c.Title,c.AddDate,c.ModifiedDate)
FROM dbo.Contact as c
WHERE c.AddDate>="1/1/2007"

 

I was trying to emulate T-SQL here but I need a date, not a string. I thought that without a function I was hosed again, until I discovered Entity SQL’s Literals and rewrote the query successfully this way.

SELECT VALUE BAModel.Contact(c.ContactID,c.FirstName,c.LastName,c.Title,c.AddDate,c.ModifiedDate)
FROM dbo.Contact as c
WHERE c.AddDate>= DATETIME’2007-01-1 00:00′

So this gives me two benefits over Conditional Mapping. Not just the greater than operator, but testing against literals. Conditional mappings with "=" can only be used with strings and integers as strings (which therefore also covers booleans). However I haven’t pushed the envelope on those, so maybe there’s a way after all to use a Date in a literal as well.

 

At the same time, I’m still working out when I would use a Defining Query over a QueryView. One obvious scenario would be when I can’t even express the query with a QueryView.

 

With a DefiningQuery, you can write native queries. Above, I’m close to doing that anyway, since this EntitySQL is written against the store layer not against the CSDL layer. So I can just back down one step further and write T-SQL queries inside the model which will return (read only, but updatable via function mappings) entities for me.

 

Not to say that QueryView is as limited as I’m discovering. We just need more code samples of when to use them besides the scenario of creating a read-only entity.

Summer’s here – must mean Snakes are back

Well, not snakeS (pl.), just snake. I’m convinced that every time I see a snake around here, it’s just the same one.

So THE snake reappeared a few days ago in an interesting place.

We have something called a Doggie Dooley buried in our yard.

I went to make a “deposit” in it a few days ago, opened the lid, and much to my surprise, there was a snake curled up on top of the contents. And this Dooley was nearly full.

Now I’ll leave it to you to find out what a Doggie Dooley would be filled with and then you might understand why I found this a little surprising. I guess I have a lot to learn about snakes.

I did amuse myself for the rest of the day with a little song I made up dedicated to this snake that any five year old would have been proud of. But I’ll keep that to myself.

 

Spring Hike

I took a much needed break (mental and physical) from sitting in front of my computer fighting with a chapter that has been a bit of a challenge for me, and cajoled my husband into taking me for a walk. It’s finally a beautiful day, about 70 degrees (F), sunny, light breeze. We have trails quite nearby our house that go up to the Long Trail, so went over to the one on the next road and hiked up to the shelter that is a stopping point along the trail, had a snack and hiked back down. It’s definitely the most bang for the buck we can get when we can’t spend a lot of time playing.

I brought my camera hoping that there would still be some spring flowers and boy were there a lot. I think because it’s been a cold spring, things are a bit delayed.

spring hike 037 spring hike 038

spring hike 042 spring hike 043

spring hike 046 spring hike 044

 spring hike 048 spring hike 039

My neighbor said she saw a big patch of LadySlippers along this path. Didn’t see too many but looks like someone picked one from here. spring hike 050 

spring hike 051 spring hike 054

My hubby at his finest. 😉
spring hike 055

What? I’m supposed to memorize it all?

It’s always funny to google for a solution to a problem and find your own blog post pop up with the answer.

I had to use an Entity SQL JOIN query today and I just went back to Chapter 5 to get a reminder of how to construct them. It’s not the first time I’ve taken advantage of what is currently my own personal resource.

A whole book on customizing the EDM?

Boy it’s feeling like it. So many nuances when you start looking at inheritance, complex types, query view, definiing queries , many-to-many mappings and then there are stored procedures. I’m wondering if I should just skip all of that in my book and plan to write a book on mapping and another one on stored procedures?

Okay okay, going back under my rock to keep at it…

🙂

Damien Guard joins the LINQ to SQL team as a developer

This isn’t even new news, but it is somewhat new to me! I met Damien at an SDR back in October and had fun sitting with him before I headed to the airport as he advised me that I should probably just get off the fence and move to C# finally. The discussion was mostly around the fact that I won’t code on the fly in C# when I do presentations because it’s not my natural coding language and I know I”ll do something wrong like use parens in an array and not be able to see why the thing won’t compile. He suggested if I was always coding in C# instead of mostly in VB and sometimes in C#, this wouldn’t be a problem.

I think it was the first time I heard someone make this argument in an attempt to truly be helpful and serious, not desecrating VB or laughing as they talked; therefore it left me with a great impression of him.

So I was very happy to hear that he took at  job with Microsoft recently and is working on the LINQ to SQL team. He’s a really bright young guy. They actually snagged a few of these guys from the SDR. Jonathan Carter was there and became a new hire shortly after.

But to me what is most significant about this is knowing that the LINQ to SQL team is hiring developers. That says to me that they are continuing to work on LINQ to SQL. I get asked about this a lot when I present. I see  questions in listservs and on blogs – if LINQ to SQL is done and Microsoft is going to make everyone who has fallen in love with LINQ to SQL use Entity Framework instead – even if they don’t want to. Even Roger Jennings  questioned this in a deeply analytical blog post. (I’m starting to wonder if Roger moonlights as a trial lawyer. ;-))

I have even seen suggestions that LINQ to SQL was intentionally cobbled and done so for political, not technical reasons. I dunno, maybe I’m just too naive; but I find that hard to believe. OTOH, I have worked for myself for nearly 20 years, so I am a little out of touch (and very happily, at that!) when it comes to corporate politics.

But I really don’t believe that this is going to happen. I do believe that LINQ to SQL will evolve and, like datasets, remain a completely viable choice for data access in .NET. I can’t say why it didn’t get a lot of attention for SP1, but comparing it to the fact that Entity Framework has been developed out of band and therefore introduced a lot of new stuff between Beta3 and the RTM version that will be part of SP1 is comparing apples to oranges.

So knowing that they are getting fresh blood (and I don’t mean warm bodies) in the form of developers on the LINQ to SQL team is, to me, an indication that the product will continue to evolve.

And of course, thanks to my memory of that conversation last fall, I have already suggested to Danny Simmons that he task Damien with writing some VB samples! Hee hee.

Hey lookatdat! You can copy and paste scalar properties in the designer

I was getting ready to suggest this feature because it’s a pain to “move” properties if you are deriving types or doing entity splitting.

I actually use the method of going into the EDMX file and copying the properties around in there so that I don’t have to worry about the attributes and facets. Especially when I have a lot of properties to move.

Just out of curiosity I right clicked on an scalar property in the designer and saw Copy on the context menu, so I clicked it. Then tried pasting it into another entity and VOILA! Not just copy and paste; but cut, copy and paste

The funny part is that may have existed in the previous bits but I never noticed it before.

I can go shorten my book by a whole page now!

(I also want you to know that I was a good girl and removed “Holy Crap!” from the blog title and replace it with exclamation that is there now.)