如何在LINQ查询的SELECT子句中使用?:运算符?如果无法做到这一点,我该如何模仿呢?目标是在我的select子句中获取CASE块。您可能怀疑,我收到一个错误:无效的匿名类型成员声明符。必须使用成员分配,简单名称或成员访问权限声明匿名类型成员。
这是一种正确的方式,还是一种充分的方式,可以说“从内部加入我的a.ipid = i.id内部加入你的i.uid = u.id”?如果没有,请提供一个。感谢。
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 };
答案 0 :(得分:18)
创建匿名类型(使用“new”进行操作而不指定类型)时,必须为每个属性指定成员名称。从您的示例中,它看起来像这样:(也修复了您的连接)
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
};
您也可以按自己的方式使用UserName:
UserName = (u.UserName == null) ? i.Address : u.UserName,
但是?运算符更简洁。它类似于SQL中的“isnull”。
答案 1 :(得分:1)
您必须使用join关键字,并定义实体之间的关系,以便进行正确的内部联接。
Here您可以找到一些相关示例,我强烈建议您使用LinqPad,它是一个非常有价值的测试查询工具,也是非常好的学习,它有200多个实例
答案 2 :(得分:0)
我对Linq to SQL相当新,但我很确定它会是这样的:
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
};
if语句需要在括号中,结果在它们之外。至于联接,你可以从一个>多个链接下来。
答案 3 :(得分:0)
如果你只检查null,你也可以使用??
string something = null;
string somethingElse = something ?? "default value";
至于上面的例子,做那些......是正确的。
string something = (somethingElse == null ? "If it is true" : "if it is false");
不需要parens,但它们确实有助于阅读。
答案 4 :(得分:0)
真。这个问题取决于您的linq表达式将返回的IQueryable的特定实现。我看到你有db.XXX所以你使用linq到sql或一些linq到数据存储?如果是这样,IQueryable的具体实现需要有一种方法将表达式转换为商店表达式。 除了上述注释之外,其他一些注释是正确的,在匿名类型中,您必须为每个成员指定一个名称。这真的是你的错误。