How do I utilize a ?: operator in the SELECT clause of a LINQ query? If this can't be done, how can I emulate one? The goal is to get a CASE block in my select clause. As you might suspect, I'm getting an error: Invalid anonymous type member declarator. Anonymous type members must be declared with a member assignment, simple name or member access.
Is this the proper way, or a sufficient way, to say "from a inner join i on a.ipid=i.id inner join u on i.uid=u.id"? If not, please provide one. Thanks.
var query = from a in db.tblActivities from i in db.tblIPs from u in db.tblUsers select new { u.UserName == null ? i.Address : u.UserName, a.Request, a.DateTime };
views:
3010answers:
5I'm fairly new to Linq to SQL but I'm pretty sure it would go like this:
var query =
from a in db.tblActivities
from i in a.tblIPs
from u in i.tblUsers
select new
{
userName = (u.UserName == null)
? i.Address
: u.UserName,
a.Request,
a.DateTime
};
The if statement needs to be in parentheses and the results outside of them. As for the joins, you follow the chain down from one->many.
You have to use the join keyword, and define the relationship between the entities in order to make a proper inner join.
Here you can find some examples about that, I also highly recommend you to get LinqPad, its a really valuable tool for testing your queries, also its very good to learn, it has 200+ examples.
if you're checking just for null, you can also use ??
string something = null;
string somethingElse = something ?? "default value";
As for the examples above, it is correct to do the ones that go...
string something = (somethingElse == null ? "If it is true" : "if it is false");
The parens aren't required, but they do aid in reading.
When creating an anonymous type (what you're doing with the "new" without specifying a type) you have to specify the member name for each property. From your example, it would look something like this: (also fixed your joins)
var query = from a in db.tblActivities
join i in db.tblIPs on a.ipid equals i.id
join u in db.tblUsers on i.uid equals u.id
select new {
UserName = (u.UserName ?? i.Address),
Request = a.Request,
Date = a.DateTime
};
You could probably do the UserName your way, too:
UserName = (u.UserName == null) ? i.Address : u.UserName,
but the ?? operator is more concise. It's similar to "isnull" in SQL.
Really. this question depends on the particular implementation of IQueryable that your linq expression will return. I see that you have db.XXX so are you using linq to sql or some linq to data store? If so, the specific implementation of IQueryable will need to have a way to translate your expression into a store expression. Other than the above comments, some of the other comments are correct that in an anonymous type you must specify a name for each member. This is really your error.