我第一次尝试使用 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/