Как вернуть Bool из фильтра Where, используя Entity Framework и Esql - PullRequest
0 голосов
/ 24 сентября 2011

Я использую c # и ef4.

У меня есть модель с сущностью с двумя свойствами int Id и string Title.

Мне нужно написать запрос ESQL, которыйв состоянии return bool TRUE, если Id и Title присутствуют в источнике данных.Обратите внимание, что Id - это PrimaryKey в моем хранилище данных.

Есть идеи, как это сделать?

Ответы [ 2 ]

4 голосов
/ 24 сентября 2011

Вы можете сделать это по каждому фрагменту кода ниже:


1)

using (YourEntityContext context = new YourEntityContext ()) {
    var queryString = 
        @"SELECT VALUE TOP(1) Model FROM YourEntityContext.Models 
              As Model WHERE Model.Id = @id AND Model.Title = @title";
    ObjectQuery<Model> entityQuery = new ObjectQuery<Model>(queryString, context);
    entityQuery.Parameters.Add(new ObjectParameter("id", id));
    entityQuery.Parameters.Add(new ObjectParameter("title", title));
    var result = entityQuery.Any();
}

2)

using (YourEntityContext context = new YourEntityContext ()) {
    ObjectQuery<Model> entityQuery = 
        context.Models
        .Where("it.Id = @id AND it.Title = @title"
            , new ObjectParameter("id", id)
            , new ObjectParameter("title", title)
        );
    var result = entityQuery.Any();
}

3)

var context = new YourEntityContext();
using (EntityConnection cn = context.Connection as EntityConnection) {
    if (cn.State == System.Data.ConnectionState.Closed)
        cn.Open();
    using (EntityCommand cmd = new EntityCommand()) {
        cmd.Connection = cn;
        cmd.CommandText = @"EXISTS(
                                SELECT M FROM YourEntityContext.Models as M 
                                WHERE M.Id == @id AND Model.Title = @title
                           )";
        cmd.Parameters.AddWithValue("id", _yourId);
        cmd.Parameters.AddWithValue("title", _yourTitle);
        var r = (bool)cmd.ExecuteScalar();
    }
}

4)

using (YourEntityContext context = new YourEntityContext ()) {
    var queryString = 
        @"EXISTS(
              SELECT M FROM YourEntityContext.Models as M 
              WHERE M.Id == @id AND Model.Title = @title
          )";
    ObjectQuery<bool> entityQuery = new ObjectQuery<bool>(queryString, context);
    entityQuery.Parameters.Add(new ObjectParameter("id", id));
    entityQuery.Parameters.Add(new ObjectParameter("title", title));
    var result = entityQuery.Execute(MergeOption.AppendOnly).FirstOrDefault();
}

4 - лучший способ, который я предлагаю вам. Хороший замок

2 голосов
/ 24 сентября 2011

То, что сказал Джавад, верно, но есть и другой способ:

bool result = entities.Any(x=>x.Id == id && x.Title == title) ; 

На самом деле, поскольку Id является первичным ключом, БД предотвращает возникновение этого более одного раза.

...