多个包含和Where子句Linq

时间:2014-01-14 00:09:24

标签: c# linq lambda

我有一个数据库,我想要返回客户列表。

这些客户有一个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();

我想知道的(显然!)是我如何才能使这个工作,但我希望如果可以在一个查询中完成数据库。即使有人能指出我正确的方向。

亲切的问候

2 个答案:

答案 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所需的最小字段数。您的需求可能会有所不同。