我有一个数据库,我想要返回客户列表。
这些客户有一个FamilyNames列表。
我从这个
开始var query = DbContext.Clients.Include(c => c.FamilyNames).ToList() //returns all clients, including their FamilyNames...Great.
但我希望有人能够搜索FamilyName,如果返回任何结果,则向客户显示客户端。
所以我这样做了......
var query = DbContext.Clients.Include(c => c.FamilyNames.Where(fn => fn.familyName == textEnteredByUser)).ToList();
我试过......
var query = DbContext.Clients.Include(c => c.FamilyNames.Any(fn => fn.familyName == textEnteredByUser)).ToList();
和...
var query = DbContext.FamilyNames.Include(c => c.Clients).where(fn => fn.familyname == textEnteredByUser.Select(c => c.Clients)).ToList();
我想知道的(显然!)是我如何才能使这个工作,但我希望如果可以在一个查询中完成数据库。即使有人能指出我正确的方向。
亲切的问候
答案 0 :(得分:2)
在Linq to Entities中,您可以浏览属性,它们将转换为连接语句。
这将返回客户列表。
var query = DbContext.Clients.Where(c => c.FamilyNames.Any(fn => fn == textEnteredByUser)).ToList();
如果您希望将所有姓氏包含在预先加载中,这应该可以:
var query = DbContext.Clients.Where(c => c.FamilyNames.Any(fn => fn == textEnteredByUser)).Include(c => c.FamilyNames).ToList();
如果某些内容无法按预期运行,则可以参考loading related entities。
答案 1 :(得分:1)
你可以使用'投影',基本上你只需要从任何级别选择你想要的字段到一个新对象,可能是匿名的。
var query = DbContext.Clients
.Where(c => c.FamilyNames.Any(fn => fn == textEnteredByUser))
// only calls that can be converted to SQL safely here
.Select(c => new {
ClientName = c.Name,
FamilyNames = c.FamilyNames
})
// force the query to be materialized so we can safely do other transforms
.ToList()
// convert the anon class to what we need
.Select(anon => new ClientViewModel() {
ClientName = anon.ClientName,
// convert IEnumerable<string> to List<string>
FamilyNames = anon.FamilyNames.ToList()
});
创建一个只包含这两个属性的匿名类,然后强制查询运行,然后对ViewModel类执行第二次投影。
通常我会选择使用ViewModel传递给UI,将其限制为UI所需的最小字段数。您的需求可能会有所不同。