c# - 使用对象查询 Entity Framework

标签 c# entity-framework

我第一次尝试使用 Entity Framework ,但有点困难。

我有一个 AccountDataAccess 类:

public class AccountDataAccess
{
    public IEnumerable<Account> Get(Account account)
    {

    }
}

还有另一个类,Account

public class Account
{
    string UserName { get; set; }
    string Password { get; set; }
    string Email { get; set; }
    Session Session { get; set; }
}

当调用 AccountDataAccess.Get() 时,可以填充一个或多个帐户参数字段(例如,只有 UserName 具有值)。 Entity Framework 中有没有一种方法可以通过仅包含包含值的字段的搜索来查询数据库?

在进行了一些谷歌搜索后,我看到这样做的唯一方法是这样的

    public IEnumerable<Account> Get(Account account)
    {
        StringBuilder queryStringBuilder = new StringBuilder("SELECT VALUE account FROM MyDatabase.Account as account WHERE ");
        if (!String.IsNullOrWhiteSpace(account.UserName))
            queryStringBuilder.Append("UserName = " + account.UserName);

        if (!String.IsNullOrWhiteSpace(account.Email))
            queryStringBuilder.Append("Email = " + account.Email);
        ...
        //continue for all fields
        //then call database
    }    

显然这是一种糟糕的做法。有什么想法吗?

编辑

举一个完整的例子,如果我有

Account account1 = new Account() {UserName = "UserA", Email = "<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="0f5a7c6a7d4e4f6a626e6663216c6062" rel="noreferrer noopener nofollow">[email protected]</a>"};
Account account2 = new Account() {UserName = "UserB"};

我希望对 account1 的查询是

    var _context = new EntityModel();

    return _context.Where(w => w.UserName == account.UserName
            && w.UserName == account1.UserName
            && w.Email == account1.Email
            ).ToList();

但是对 account2 的查询会忽略电子邮件字段,因为该字段未填充:

    var _context = new EntityModel();

    return _context.Where(w => w.UserName == account2.UserName
            ).ToList();

所以我想我的问题是我可以动态生成Where lambda 表达式以仅包含具有值的字段吗?

最佳答案

在添加 ToList() 等评估操作之前,不会处理查询。因此,您可以做的一件事就是像在 SQL 中那样构建查询。

var query = _context.Accounts.AsQueryable();

if (!String.IsNullOrWhiteSpace(account1.UserName))
    query = query.Where(a => a.UserName == account1.UserName);

if (!String.IsNullOrWhiteSpace(account1.Email))
    query = query.Where(a => a.Email == account1.Email);

您也可以使用查询语法执行相同的操作,尽管它有点冗长。

构建完查询后,对其运行 ToList()、ToArray() 等以实际执行它并从数据库中读取。

关于c# - 使用对象查询 Entity Framework ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9650692/

相关文章:

c# - 将脏 Excel 2007 文件导入并清理到 SQL Server 2005

c# - ConcurrentQueue 一个元素被两个线程取走

c# - 是什么原因导致 "ConvertResourcesCases"意外失败?

mysql - Entity Framework 5(MySQL)作为现有MVC4解决方案上的项目(类库)

c# - 人们如何使用 Entity Framework 6 进行单元测试,你应该打扰吗?

c# - EF 代码生成 : How to get a System enum to work as an EdmEnumType?

基于登录路由的 C# MVC4 登录操作

c# - Resharper 重新格式化 Linq 语句以放入并选择同一行

winforms - 将实体绑定(bind)到 Windows DataGridView

xml - 将 (Sql Server) xml 列与 Entity Framework 一起使用