2014-01-14 74 views
1

我有一个数据库,我想要返回一个客户端列表。多个包含和where子句Linq

这些客户端有一个FamilyName列表。

我开始用这个

var query = DbContext.Clients.Include(c => c.FamilyNames).ToList() //returns all clients, including their FamilyNames...Great. 

但我希望有人能够搜索FamilyName,ifany结果返回,然后显示客户端用户。

所以我做了这个......

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

查询得到执行?或者在运行时有一些错误或异常? 我有嵌套的IQueryable查询的问题,并且解决方案是在运行期间强制转换.AsEnumerable并将一些数据存入Memody。 请写一些细节,也许我会提醒...... – michalczukm

回答

2

在LINQ to您可以在性能导航实体,他们将被转化为加入语句。

这将返回一个客户端列表。

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一些参考,如果按照预期的东西不起作用。

+0

对不起,我有点太快回答。它有效,但我想包括的是客户,包括他们的FamilyNames。谢谢 – James

+1

我认为这应该按照http://msdn.microsoft.com/en-us/data/jj574232.aspx:DbContext.Clients.Where(c => c.FamilyNames.Any(fn => fn = = textEnteredByUser))。Include(c => c.FamilyNames).ToList(); – Cosmin

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类。

通常,我会选择传递给UI的ViewModel,将其限制为UI所需的最少数量的字段。您的需求可能有所不同

+1

我认为这会失败。 ToList()不能转换为linq到实体的查询。 – Cosmin

+1

@Cosmin是的,对不起,我是在我头顶上做的,在我的代码中,我经常需要投影两次,一次使用数据库安全调用,第二次使用任何不是DB-安全(如格式化,调用其他方法进行转换等)。我会更新我的答案。 –