考虑下面的类都值:检查集合包含了另一个集合与延迟执行
public class Recipe
{
public string Id { get; set; }
public ICollection<RecipeFacet> RecipeFacets { get; set; }
}
public class RecipeFacet
{
public string Id { get; set; }
public Facet Facet { get; set; }
public string RecipeId { get; set; }
}
public class Facet
{
public string Name { get; set; }
}
我需要改进现有的查询。我正在考虑使用Linq的延期执行。我如何编写一个仅返回Recipes
的Linq查询,其中包含我在Tuples
列表中指定的ALL Facets
?
这是通过Recipes
及其Facets
循环的原始代码。它的工作原理,但如果我的初始results
查询有很多Recipes
它很慢。
IQueryable<Recipe> result; //assume we have data here
string query = "Cuisine:American+Recipe-Type:dinners";
IEnumerable<Tuple<string, string>> taxFacets = query
.Split(' ')
.Select(tf => tf.Split(':'))
.Select(tf => new Tuple<string, string>(tf[0], tf[1]))
.Distinct();
var recipeFacetCollection = result.Select(r => r.RecipeFacets).ToList();
var matchedRecipesIds = new List<string>();
var recIds = result.Select(r => r.Id).ToList();
// initially, include all recipes
matchedRecipesIds.AddRange(recIds);
// loop through each recipe's facet collection
foreach (var col in recipeFacetCollection)
{
// loop through the tax facets from the query
foreach (var tf in taxFacets)
{
var exists = col.Any(f => f.Facet.Name.Equals(tf.Item2, StringComparison.OrdinalIgnoreCase));
// remove any recipe that is missing a facet
if (!exists)
{
matchedRecipesIds.Remove(col.First().RecipeId);
}
}
}
result = result.Where(r => matchedRecipesIds.Contains(r.Id));
我怎样才能有一个很好的Linq查询与延期执行?
更新::
把我的元组到列表允许我做这件事。但是这个查询不会返回我的任何记录。
这是我的准则:
Recipes
,即有RecipeFacts
的集合,包含Facets
有名称= “美国” AND NAME = “晚餐”。
var listFacets = new List<string>()
{
"American",
"dinners"
};
result = result
.Where(r => r.RecipeFacets
.All(f => !listFacets.Any(t => t.Equals(f.Facet.Name, StringComparison.OrdinalIgnoreCase))));
感谢您的建议。但是我得到这个错误:“无法创建一个'System.Tuple'类型的常量值。在这种情况下,只支持原始类型或枚举类型。 – duyn9uyen
您可以发布您的代码吗?哪行代码会出错? –
我正在使用你的建议。做一个result.toList()抛出该错误。 – duyn9uyen