查询的多个要求

时间:2012-03-12 11:45:51

标签: c# database linq

不确定怎么说这个但是这里有。我正在使用linq为服务器编写服务层。我已经有了数据库设置,并且我继承了使用Entity层的类(它将被WCF层替换为正确使用JSON - 这个项目的软件需求)。我目前正在编写一个名为“JoinCalendar”的方法(应用程序的一个主要部分),我想证明用户有效加入日历。

这是startes的代码

public bool JoinCalendar(int famID, string email)
{   
 using (FamilySchedulerEntities db = new FamilySchedulerEntities())
 {
   var checkUser = (from u in db.Users
                    where u.familyID.Equals(famID) && !u.emailAddress.Equals(email, StringComparison.InvariantCultureIgnoreCase)
                    select u).FirstOrDefault();

  if( checkuser != null){ return false}
  else
  {
    //stuff
    return true;
  }

此方法的目的是获取用户正在尝试加入的日历的familyID(一组用户的标识字段)以及用户emailaddress(每个用户的唯一ID)。我想从该查询中执行两个不同的检查。

首先:我想检查familyID是否有效(即确保familyID是存储在数据库中的实际值) 其次:检查用户的电子邮件地址是否与注册到任何家庭的用户不匹配 第三:我可以使用“!” linq查询中的运算符oris it bad practice / ttiquette

亲切的问候, 西蒙约翰逊

PS。只使用linq(实际上是编写数据库应用程序)不到一周,所以请保持这个新手友好。理想情况下,我需要一个超级elegenat解决方案,因为该服务器的客户端可能使用蜂窝(即非wifi)连接进行连接,我需要将数据传输保持在绝对最小值。如果最好的解决方案是 hard ,那么请解释它吧。

2 个答案:

答案 0 :(得分:1)

您的两个要求可以表达为:

bool familyExists = db.Users.Any(u => u.familyID == famID);
bool emailTakenAlready = db.Users.Any(u => u.emailAddress == email);

这些似乎是独立的要求,因此您可以对它们进行单独的查询。

你肯定可以在Linq查询中使用逻辑not(!),这只是个人风格的问题。

答案 1 :(得分:1)

您可以像这样简化:

    public bool JoinCalendar(int famID, string email)
    {
        using (var db = new DataContext())
        {
            var exists = db.Users.Any(u => u.familyID == famID && u.emailAddress != email);
            if (exists)
            {
                return false;
            }
            //stuff
            return true;
        }
    }

它也应该是最有效的,因为该查询可以由数据库优化。