我有一个针对 IEnumerable 一直使用的方法,没问题。不过我也想开始对 IQueryable 使用它。但是,我目前的方式不起作用,因为它试图针对数据库执行我的方法。
情况如下。如果选择的值为 null,或者属性的 ID 和名称(如果存在),我希望我选择的对象上的属性为 null。例如:
var foos = FooRepository.All().Select(s => new FooBrief()
{
Id = s.Id,
Customer = SimpleData.To(s.Customer, m => m.Id, m => m.Name)
});
其中 SimpleData.To
看起来像:
public class SimpleData
{
public int Id { get; set; }
public string Name { get; set; }
public static SimpleData To<T>(T t, Func<T, int> id, Func<T, string> name) where T : class
{
if (t != null)
{
return new SimpleData { Id = id(t), Name = name(t) };
}
return null;
}
}
有什么办法可以让我获得这种行为,同时允许它针对数据库执行吗?
注意:由于代码中其他地方的原因,我无法使用 .ToList()。我稍后可能会添加额外的过滤
最佳答案
最简单的方法是使用 AsEnumerable
在数据库外部执行选择:
var foos = FooRepository.All()
.Select(x => new { Id = x.Id,
CustomerId = x.Customer.Id,
CustomerName = x.Name })
.AsEnumerable()
.Select(s => new FooBrief {
Id = s.Id,
Customer = new SimpleData {
Id = s.CustomerId,
Name = s.CustomerName
}
});
第一个Select
只是为了确保数据库查询只提取所需的字段。如果您确实仍想使用 SimpleData.To
方法:
// Outdented to avoid scrolling
var foos = FooRepository.All()
.Select(x => new { Id = x.Id,
CustomerId = x.Customer.Id,
CustomerName = x.Name })
.AsEnumerable()
.Select(s => new FooBrief {
Id = s.Id,
Customer = SimpleData.To(s,
s => s.CustomerId,
s => s.CustomerName)
});
关于c# - 解决 LINQ to Entities 无法识别该方法的方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17216542/