?:LINQ查询中的运算符

时间:2008-11-12 02:08:39

标签: c# linq linq-to-sql

  • 如何在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 };
    

5 个答案:

答案 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的具体实现需要有一种方法将表达式转换为商店表达式。 除了上述注释之外,其他一些注释是正确的,在匿名类型中,您必须为每个成员指定一个名称。这真的是你的错误。

相关问题