【发布时间】:2012-03-11 09:28:29
【问题描述】:
我是第一次尝试使用 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 具有值)。 实体框架中是否有一种方法可以通过仅包含包含值的字段的搜索来查询数据库?
做了一些谷歌搜索后,我能看到的唯一方法是
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 = "UserA@email.com"};
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 表达式以仅包含具有值的字段吗?
【问题讨论】:
-
只是一个注释...在您的界面前加上一个 I... 是个好习惯,因此您应该将 Account 界面重命名为 IAccount。
标签: c# entity-framework