使用LINQ(到实体)查询对象的存在

时间:2010-04-30 13:18:22

标签: .net linq linq-to-entities

(我在括号中加上“...... to Entities”,因为我不知道这是否重要。我想这是一个非常普遍的LINQ相关问题。)

如果数据库中存在对象,我想检查LINQ(实体)。目前我正在做以下事情:

using (MyEntitiesContext aCtx = new MyEntitiesContext())
{
    var aQuery = from c
                 in aCtx.Client
                 where c.ClientID==1
                 select c;

    Client aClient = aQuery.FirstOrDefault();

    bool Exists = (aClient!=null);
    ...
}

但是(如果我没有错)这将从数据库加载完整的Client对象(如果客户端存在)。我实际上只是在没有加载对象的情况下感兴趣它是否存在。

SQL具有SELECT COUNT(*)...构造。我能用LINQ做些类似的东西吗?

感谢您的建议!

4 个答案:

答案 0 :(得分:7)

一种选择是使用IQueryable的Any方法。它将返回一个布尔值,指示是否找到与指定条件匹配的对象。

using (MyEntitiesContext aCtx = new MyEntitiesContext())
{
    bool exists = (from c
                   in aCtx.Client
                   where c.ClientID==1
                   select c).Any();
}

此方法在评估为true时也会停止运行。

答案 1 :(得分:2)

然后我会使用Any()来确定存在。无论您是否创建如下所示的虚拟实例,编译器都将使用Exists函数创建一个SQL语句,因此,Select语句中的内容无关紧要。

var query= from c
            in context.Client
            where c.ClientID == 1
            select new { Dummy = "foo" };

var exists = query.Any();

答案 2 :(得分:0)

你可以试试......

using (MyEntitiesContext aCtx = new MyEntitiesContext())
{
     var aQuery = from c
         in aCtx.Client
         where c.ClientID==1
         select c;

     int total = aQuery.Count();

     bool Exists = (total > 0);
     ...
}

未经测试......

答案 3 :(得分:0)

您可以在查询中使用Count()运算符或Any运算符来检查它是否会返回结果:

using (MyEntitiesContext aCtx = new MyEntitiesContext())
{
    var aQuery = from c
                 in aCtx.Client
                 where c.ClientID==1
                 select c;

    int count = aQuery.Count();

    bool Exists = (count > 0);

    // or
    Exists = aQuery.Any();

    ...
}